Главная страница
    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.055 c
2-1232511133
Тимоха
2009-01-21 07:12
2009.03.15
размер программы


15-1231856375
Jeer
2009-01-13 17:19
2009.03.15
Кольцо сайтов "Научная книга" ?


15-1231595136
Slider007
2009-01-10 16:45
2009.03.15
С днем рождения ! 10 января 2009 суббота


15-1231989207
Slider007
2009-01-15 06:13
2009.03.15
С днем рождения ! 15 января 2009 четверг


15-1231668190
Leshiy
2009-01-11 13:03
2009.03.15
Backup/restore через удаленный рабочий стол





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