Главная страница
    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.47 MB
Время: 0.04 c
2-1232644918
markers
2009-01-22 20:21
2009.03.15
Проблема Extended или туплю?


4-1206607413
kolj
2008-03-27 11:43
2009.03.15
Tapi -> LineGetId


15-1231595355
Slider007
2009-01-10 16:49
2009.03.15
С днем рождения ! 9 января 2009 пятница


15-1231418031
unregistered
2009-01-08 15:33
2009.03.15
Есть автомагнитолы, которые НЕ распознают mp3 в папках?


15-1231485931
Оксана
2009-01-09 10:25
2009.03.15
Создание отчетности в Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский