Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.15;
Скачать: CL | DM;

Вниз

пишу графический редактор. Помогите кое в чем.   Найти похожие ветки 

 
Наташкин   (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 вся ветка

Текущий архив: 2009.03.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
6-1200679020
ad_Wolf
2008-01-18 20:57
2009.03.15
Вопрос по Indy


3-1216371039
webpauk
2008-07-18 12:50
2009.03.15
Транзакции и параметры


2-1232942009
Drowsy
2009-01-26 06:53
2009.03.15
Не получается точно определить ширину текста на канве.


2-1232625697
fat.hamster
2009-01-22 15:01
2009.03.15
Правильный способ обработки ошибок в OnCreate?


2-1232749601
donduras
2009-01-24 01:26
2009.03.15
Перетаскивание динамически созданных image