-
Всем привет. Я пишу графический редактор, типа paint, но с некоторомы дополнительными фильтрами. Самое смешное, что фильтры все нормально работают, а вот paint глючит. Проблем несколько: 1. Необходимо реализовать поворот изображения. Я что - то написала, но он у меня взащает само изображение, а не холст и при повороте на 90 градусов получается, что изображение повернулось, но вышло за пределы холста. 2. Что-то я никак не придумаю, как бы написать процедуру "Отменить ctrl-z", мне нужно только на 1 действие. 3. Вырезать - Вставить - Копировать. Вродебы все работает, но когда вырезает, вставляет только в левый верхний угол, а надо что-бы можно было двигать....
Помогите, пожалуйста. Или хотя бы скиньте ссылки на какие-нибудь исходники... Очень надо. ;)
-
А на чём всё реализовывается, TPaintBox, TImage, TBitmap?
-
TBitmap
-
1. Создаёшь промежуточный битмап с новыми размерами, на котором рисуёшь повёрнутое изображение, а потом его присваиваешь своему битмапу. 2. Создаёшь ещё один битмап (BackBitmap) в который копируешь свой битмап перед тем как сделать какие-то преобразования. Если надо отменить, то соответственно копируешь на свой битмап BackBitmap. 3. Перед тем, как вставить битмап, копируешь в промежуточный буфер то, что будет под вставленным битмапом. При передвижении, сначала закрашиваешь своим предыдущее местоположение рисунком из буфера, после снова копируешь в буфер кусок, где будет находится вырезанный битмап и рисуешь его и так далее.
-
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;
-
Сейчас попробую. ) Спасибо
-
Если хочется побыстрее, то можно сделать со 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;
-
а ты реализовала масштабирование???? Если да то каким образом? не тормозит при прорисовке
-
дай мне полную програму я исправлю
|