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

Вниз

Скорость работы с Bitmap   Найти похожие ветки 

 
Mirror ©   (2006-05-02 15:20) [0]

Мне необходимо делать некоторые преобразования картинок. Для начала я просто попробовал сделать обычное цветоразностное преобразование (из RGB в YCrCb). Для этого я беру каждую точку Bitmap (просто цикл по всем X и Y) и по известной формуле Y=0.299R+0.586G+0.114B высчитываю соответствующую компоненту. Проблема в том, что всё это происходит очень долго. Что я не так делаю?

Вот кусок кода с самим преобразованием (Реально формат остаётся RGB потому что мне необходимо чисто визуально показать цветоразностные компоненты):
Var
Y,X,TR,TG,TB,TY,TCr,Tcb,P: Integer;
begin
Form1.ProgressBarYCrCb.Position:=0;
P:=Trunc(Form1.ImageEnViewR.Bitmap.Height/100);
Form1.ImageEnViewY.Bitmap.Height:=Form1.ImageEnViewR.Bitmap.Height;
Form1.ImageEnViewY.Bitmap.Width:=Form1.ImageEnViewR.Bitmap.Width;
Form1.ImageEnViewCr.Bitmap.Height:=Form1.ImageEnViewR.Bitmap.Height;
Form1.ImageEnViewCr.Bitmap.Width:=Form1.ImageEnViewR.Bitmap.Width;
Form1.ImageEnViewCb.Bitmap.Height:=Form1.ImageEnViewR.Bitmap.Height;
Form1.ImageEnViewCb.Bitmap.Width:=Form1.ImageEnViewR.Bitmap.Width;
For Y:=0 to Form1.ImageEnViewR.Bitmap.Height - 1 do
 Begin
 For X:=0 to Form1.ImageEnViewR.Bitmap.Width - 1 do
   Begin
   TR:=Form1.ImageEnViewR.Bitmap.Canvas.Pixels[X,Y];
   TR:=TR and $FF;
   TG:=Form1.ImageEnViewG.Bitmap.Canvas.Pixels[X,Y];
   TG:=TG and $FF;
   TB:=Form1.ImageEnViewB.Bitmap.Canvas.Pixels[X,Y];
   TB:=TB and $FF;
   TY:=Trunc(0.299*TR+0.586*TB+0.114*TG);
   TCr:=ABS(Trunc(-0.169*TR-0.331*TB+0.5*TG));
   TCb:=ABS(Trunc(0.5*TR-0.419*TB-0.081*TG));
   TY:=TY or (TY shl 8) or (TY shl 16);
   TCr:=TCr or (TCr shl 8) or (TCr shl 16);
   TCb:=TCb or (TCb shl 8) or (TCb shl 16);
   Form1.ImageEnViewY.Bitmap.Canvas.Pixels[X,Y]:=TY;
   Form1.ImageEnViewCr.Bitmap.Canvas.Pixels[X,Y]:=TCr;
   Form1.ImageEnViewCb.Bitmap.Canvas.Pixels[X,Y]:=TCb;
   End;
 Form1.ProgressBarYCrCb.Position:=Trunc(Y/P);
 End;
Form1.ImageEnViewY.Fit;
Form1.ImageEnViewCr.Fit;
Form1.ImageEnViewCb.Fit;
Form1.ProgressBarYCrCb.Position:=100;

Извините, за немного некрасивый код (написан минут за пять-десять) Мне важно больше не то что он считает, а то с какой скоростью он это делает.


 
Poirot ©   (2006-05-02 15:27) [1]

ScanLine вместо Pixels? Думаю будет побыстрее!


 
Jeer ©   (2006-05-02 17:58) [2]

FastLib ?


 
capkoh ©   (2006-05-02 20:29) [3]

Я люблю использовать DIB, а конкретно - CreateDIBSection. Всё работает очень быстро.


 
programania ©   (2006-05-02 21:37) [4]

>Мне необходимо делать некоторые преобразования картинок

Вот процедуры преобразования картинок в bitmap со scanLine:
Rotate, Resize, Emboss, Plasma, MandelBrot,
GaussianBlur, Smooth, Contrast, Lightness, Saturation, AntiAlias, FishEye, Strecth, Tile и т.п.
http://programania.ru/janfx.zip 19кб



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.061 c
15-1164323826
Номер
2006-11-24 02:17
2006.12.17
Что случилось с pisem.net ? Уже дней пять не работает


15-1164629045
Cyrax
2006-11-27 15:04
2006.12.17
Какой антивирус наиболее удобен ?


15-1164394143
ferr
2006-11-24 21:49
2006.12.17
Забавно :)


15-1164692448
Nic
2006-11-28 08:40
2006.12.17
С днём рождения 28 ноября


2-1164784280
RebroFF
2006-11-29 10:11
2006.12.17
Формат отображения данных в DBEdit