![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
пишу графический редактор. Помогите кое в чем.
Наташкин © (2007-07-07 18:44:00)Всем привет.
Я пишу графический редактор, типа paint, но с некоторомы дополнительными фильтрами. Самое смешное, что фильтры все нормально работают, а вот paint глючит.
Проблем несколько:
1. Необходимо реализовать поворот изображения. Я что - то написала, но он у меня взащает само изображение, а не холст и при повороте на 90 градусов получается, что изображение повернулось, но вышло за пределы холста.
2. Что-то я никак не придумаю, как бы написать процедуру "Отменить ctrl-z", мне нужно только на 1 действие.
3. Вырезать - Вставить - Копировать. Вродебы все работает, но когда вырезает, вставляет только в левый верхний угол, а надо что-бы можно было двигать....
Помогите, пожалуйста. Или хотя бы скиньте ссылки на какие-нибудь исходники... Очень надо. ;)
fgfh (2007-10-10 08:51:00) [1]дай мне полную програму я исправлю
ustamshiy (2007-10-09 02:24:00) [2]а ты реализовала масштабирование????
Если да то каким образом? не тормозит при прорисовке
Efir (2007-07-07 19:43:00) [3]Если хочется побыстрее, то можно сделать со ScanLine:
Для изображений 1, 8, 24 бит.
procedure Rotate90(var Bitmap:TBitmap);
var
pix1,pix2:array of PByteArray;
NewBitmap:TBitmap;
x,y,w,h:integer;
Bit:byte;
begin
w:=Bitmap.Width;
h:=Bitmap.Height;
NewBitmap:=TBitmap.Create;
NewBitmap.PixelFormat:=Bitmap.PixelFormat;
NewBitmap.Palette:=CopyPalette(Bitmap.Palette);
NewBitmap.Width:=h;
NewBitmap.Height:=w;
SetLength(pix1,h);
SetLength(pix2,w);
for y:=0 to h-1 do pix1[y]:=Bitmap.ScanLine[y];
for y:=0 to w-1 do pix2[y]:=NewBitmap.ScanLine[y];
dec(w);
dec(h);
case Bitmap.PixelFormat of
pf1bit:for y:=0 to w do begin
for x:=0 to h do begin
Bit:=(pix1[x][(w-y) div 8] shl ((w-y) mod 8)) and 128;
if Bit=0 then pix2[y][x div 8]:=pix2[y][x div 8] xor (128 shr (x mod 8));
end;
end;
pf8bit:for y:=0 to w do
for x:=0 to h do pix2[y][x]:=pix1[x][w-y];
pf24bit:for y:=0 to w do
for x:=0 to h do begin
pix2[y][x*3]:=pix1[x][(w-y)*3];
pix2[y][x*3+1]:=pix1[x][(w-y)*3+1];
pix2[y][x*3+2]:=pix1[x][(w-y)*3+2];
end;
end;
Bitmap.Assign(NewBitmap);
NewBitmap.Free;
end;
Наташкин (2007-07-07 19:20:00) [4]Сейчас попробую. ) Спасибо
Dib@zol (2007-07-07 19:09:00) [5]function getBitmapSize(B:HBITMAP):SIZE;
var buf : BITMAP;
begin
FillChar(buf, SizeOf(BITMAP), 0);
GetObject(B, SizeOf(BITMAP), @buf);
result.cx:=buf.bmWidth;
result.cy:=buf.bmHeight;
end;
1] Вот реализация. Изиняюсь за АПИ, HBITMAP = TBitmap.Handle
function getBitmapSize(B:HBITMAP):SIZE;
var buf : BITMAP;
begin
FillChar(buf, SizeOf(BITMAP), 0);
GetObject(B, SizeOf(BITMAP), @buf);
result.cx:=buf.bmWidth;
result.cy:=buf.bmHeight;
end;
function rotateBMP(B:HBITMAP):HBITMAP;
var
DCS, DCD, tB, tR : HGDIOBJ;
sz : SIZE;
i, j : Word;
begin
sz:=getBitmapSize(B);
DCS:=CreateCompatibleDC(0);
tB:=SelectObject(DCS, B);
result:=CreateCompatibleBitmap(DCS, sz.cy, sz.cx);
DCD:=CreateCompatibleDC(0);
tR:=SelectObject(DCD, result);
for i:=0 to sz.cx-1 do
for j:=0 to sz.cy-1 do
SetPixel(DCD, sz.cy-1-j, i, GetPixel(DCS, i, j));
SelectObject(DCS, tB);
SelectObject(DCD, tR);
end;
Efir (2007-07-07 19:07:00) [6]1. Создаёшь промежуточный битмап с новыми размерами, на котором рисуёшь повёрнутое изображение, а потом его присваиваешь своему битмапу.
2. Создаёшь ещё один битмап (BackBitmap) в который копируешь свой битмап перед тем как сделать какие-то преобразования. Если надо отменить, то соответственно копируешь на свой битмап BackBitmap.
3. Перед тем, как вставить битмап, копируешь в промежуточный буфер то, что будет под вставленным битмапом. При передвижении, сначала закрашиваешь своим предыдущее местоположение рисунком из буфера, после снова копируешь в буфер кусок, где будет находится вырезанный битмап и рисуешь его и так далее.
Наташкин (2007-07-07 18:54:00) [7]TBitmap
Efir (2007-07-07 18:53:00) [8]А на чём всё реализовывается, TPaintBox, TImage, TBitmap?