Форум: "Media";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];
Внизпишу графический редактор. Помогите кое в чем. Найти похожие ветки
← →
Наташкин (2007-07-07 18:44) [0]Всем привет.
Я пишу графический редактор, типа paint, но с некоторомы дополнительными фильтрами. Самое смешное, что фильтры все нормально работают, а вот paint глючит.
Проблем несколько:
1. Необходимо реализовать поворот изображения. Я что - то написала, но он у меня взащает само изображение, а не холст и при повороте на 90 градусов получается, что изображение повернулось, но вышло за пределы холста.
2. Что-то я никак не придумаю, как бы написать процедуру "Отменить ctrl-z", мне нужно только на 1 действие.
3. Вырезать - Вставить - Копировать. Вродебы все работает, но когда вырезает, вставляет только в левый верхний угол, а надо что-бы можно было двигать....
Помогите, пожалуйста. Или хотя бы скиньте ссылки на какие-нибудь исходники... Очень надо. ;)
← →
Efir © (2007-07-07 18:53) [1]А на чём всё реализовывается, TPaintBox, TImage, TBitmap?
← →
Наташкин (2007-07-07 18:54) [2]TBitmap
← →
Efir © (2007-07-07 19:07) [3]1. Создаёшь промежуточный битмап с новыми размерами, на котором рисуёшь повёрнутое изображение, а потом его присваиваешь своему битмапу.
2. Создаёшь ещё один битмап (BackBitmap) в который копируешь свой битмап перед тем как сделать какие-то преобразования. Если надо отменить, то соответственно копируешь на свой битмап BackBitmap.
3. Перед тем, как вставить битмап, копируешь в промежуточный буфер то, что будет под вставленным битмапом. При передвижении, сначала закрашиваешь своим предыдущее местоположение рисунком из буфера, после снова копируешь в буфер кусок, где будет находится вырезанный битмап и рисуешь его и так далее.
← →
Dib@zol © (2007-07-07 19:09) [4]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;
← →
Наташкин (2007-07-07 19:20) [5]Сейчас попробую. ) Спасибо
← →
Efir © (2007-07-07 19:43) [6]Если хочется побыстрее, то можно сделать со 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;
← →
ustamshiy (2007-10-09 02:24) [7]а ты реализовала масштабирование????
Если да то каким образом? не тормозит при прорисовке
← →
fgfh (2007-10-10 08:51) [8]дай мне полную програму я исправлю
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.066 c