Конференция "Media" » пишу графический редактор. Помогите кое в чем.
 
  • Наташкин (07.07.07 18:44) [0]
    Всем привет.
    Я пишу графический редактор, типа paint, но с некоторомы дополнительными фильтрами. Самое смешное, что фильтры все нормально работают, а вот paint глючит.
    Проблем несколько:
    1. Необходимо реализовать поворот изображения. Я что - то написала, но он у меня взащает само изображение, а не холст и при повороте на 90 градусов получается, что изображение повернулось, но вышло за пределы холста.
    2. Что-то я никак не придумаю, как бы написать процедуру "Отменить ctrl-z", мне нужно только на 1 действие.
    3. Вырезать - Вставить - Копировать. Вродебы все работает, но когда вырезает, вставляет только в левый верхний угол, а надо что-бы можно было двигать....

    Помогите, пожалуйста. Или хотя бы скиньте ссылки на какие-нибудь исходники... Очень надо. ;)
  • Efir © (07.07.07 18:53) [1]
    А на чём всё реализовывается, TPaintBox, TImage, TBitmap?
  • Наташкин (07.07.07 18:54) [2]
    TBitmap
  • Efir © (07.07.07 19:07) [3]
    1. Создаёшь промежуточный битмап с новыми размерами, на котором рисуёшь повёрнутое изображение, а потом его присваиваешь своему битмапу.
    2. Создаёшь ещё один битмап (BackBitmap) в который копируешь свой битмап перед тем как сделать какие-то преобразования. Если надо отменить, то соответственно копируешь на свой битмап BackBitmap.
    3. Перед тем, как вставить битмап, копируешь в промежуточный буфер то, что будет под вставленным битмапом. При передвижении, сначала закрашиваешь своим предыдущее местоположение рисунком из буфера, после снова копируешь в буфер кусок, где будет находится вырезанный битмап и рисуешь его и так далее.
  • Dib@zol © (07.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;
  • Наташкин (07.07.07 19:20) [5]
    Сейчас попробую. ) Спасибо
  • Efir © (07.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 (09.10.07 02:24) [7]
    а ты реализовала масштабирование????
     Если да то каким образом? не тормозит при прорисовке
  • fgfh (10.10.07 08:51) [8]
    дай мне полную програму я исправлю
 
Конференция "Media" » пишу графический редактор. Помогите кое в чем.
Есть новые Нет новых   [134431   +10][b:0][p:0.001]