Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.042 c
2-1232983616
Мишаняя
2009-01-26 18:26
2009.03.15
Открыть в проводнике


15-1231918204
Рыбба
2009-01-14 10:30
2009.03.15
Как правильно наследоваться от TDataModule?


2-1232948305
charoey_mag
2009-01-26 08:38
2009.03.15
Скриншот Рабочего стола


3-1216717712
DelphiN!
2008-07-22 13:08
2009.03.15
Поиск символа из масcива в строке


15-1231101557
DillerXX
2009-01-04 23:39
2009.03.15
Кодирование DVD-video





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский