![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скорость работы с Bitmap [D7, WinXP]
Mirror © (2006-05-02 15:20:00)Мне необходимо делать некоторые преобразования картинок. Для начала я просто попробовал сделать обычное цветоразностное преобразование (из 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;
Извините, за немного некрасивый код (написан минут за пять-десять) Мне важно больше не то что он считает, а то с какой скоростью он это делает.
programania (2006-05-02 21:37:00) [1]>Мне необходимо делать некоторые преобразования картинок
Вот процедуры преобразования картинок в bitmap со scanLine:
Rotate, Resize, Emboss, Plasma, MandelBrot,
GaussianBlur, Smooth, Contrast, Lightness, Saturation, AntiAlias, FishEye, Strecth, Tile и т.п.
http://programania.ru/janfx.zip19кб
capkoh (2006-05-02 20:29:00) [2]Я люблю использовать DIB, а конкретно - CreateDIBSection. Всё работает очень быстро.
Jeer (2006-05-02 17:58:00) [3]FastLib ?
Poirot (2006-05-02 15:27:00) [4]ScanLine вместо Pixels? Думаю будет побыстрее!