![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
read write pixel (hight fps) [D5, D6, 95/98, ME, XP]
Dr.M@$ © (2007-05-06 22:30:00)Подскажите пожайлуста как из битмапа прочитать или записать пиксель но чтоб это быстро работало
picture.canvas.getpixe работает ооооочень медленно.
Dr.M@$ (2007-05-10 19:18:00) [1]ээээ-э-э-э!!! Люди ! вы о чем ??!! :) этотрздел форума был исключительно по ScanLine!!! Хотя признаюсь чт ваши диалоги читать было приятно.
> > И эта.. может проще так присваивать: P2^ := P1^;
>
> Опять двадцать пять. Я ж говорю - специально так написал,
> чтобы человеку ясно было как обратиться к каждой цветовой
> составляющей. Я ж полагаю, что ему не тупое копирование
> битмапа нужно, а все таки какое - то преобразование цветовых
> составляющий.
Тут ты прав. Это самое главное для меня. Я делал для предприятия программу сканирования продукции... Программа опредиляла тип продукции(камера и карта видеозахвата), цвет(цветавой диапозон камеры), и высоту (использовал лазер). но прга с скоростью конвеера неспровлялась. так как я использовал соманды canvas.pixel[x,y]; и вот терперь очень нужно всю мою старую идею "перелопатить"... а с канвой я на вы! всегда все делал при помощи DirectX & OpenGL... и то вставлял спрайты и 3д обьекты... www.netherearth.narod.ru это не риклама. это пример... :) Всем спасибо! считаю тему исчерпаной.
Anatoly Podgoretsky (2007-05-10 18:29:00) [2]> DVM (10.05.2007 16:54:36) [36]
Не вижу, там что то про сон только.
DVM (2007-05-10 16:54:00) [3]
> Anatoly Podgoretsky © (10.05.07 16:50) [35]
я поправился же в [32]
Anatoly Podgoretsky (2007-05-10 16:50:00) [4]> DVM (10.05.2007 07:32:31) [31]
Если в конструкторе 1 или
втором произойдет
исключения, то до finally дело
не дойдет
DVM (2007-05-10 11:13:00) [5]
> Но практически исключение в конструкторе для TBitmap произойти
> не может.
Именно для битмапа согласен. Но за остальные классы не ручаюсь. А так как изучать деструктор каждого класса vcl мне не очень интересно, так же изучать деструкторы всех объектов, которые написаны другими прогаммистами, то лучше писать одинаково везде - хуже от этого не будет.
> Так что если ли толк он лишних try..finally? Думаю, что
> нет!
Это скорее благо, чем зло. Вырабатывает привычку писать программы без утечек памяти и прочее. Я сторонник подхода - лучше лишний раз проверить что-то если неуверен, чем полагаться на авось. Т.е я лучше лишний IF поставлю или try.
Loginov Dmitry (2007-05-10 10:56:00) [6]> Например следующий код может привести к ошибкам:
Теоретически. Но практически исключение в конструкторе для TBitmap произойти не может. Противоположность ему - TFileStream.
Также исключение не может произойти для TMemoryStream, TList, TStringList и т.п. Ислючение в конструкторе практически может произойти для TComponent и всех наследников, а также для всех объектов, для которых в конструкторе назначается владелец.
Так что если ли толк он лишних try..finally? Думаю, что нет!
DVM (2007-05-10 10:19:00) [7]
> Если в конструкторе первого класса произойдет исключение...
это я загнул, конечно, спросоня :).
DVM (2007-05-10 07:32:00) [8]
> Loginov Dmitry © (10.05.07 00:50) [30]
> А нафик здесь лишний try..finally?
Ну ей богу!
Каждое выделение ресурсов в программе должно сопровождаться отдельным Try..finally. Например следующий код может привести к ошибкам:
SomeClass1 := TSomeClass1.Create;
SomeClass2 := TSomeClass2.Create;
try
...
finally
SomeClass1.Free;
SomeClass2.Free;
end;
Если в конструкторе первого класса произойдет исключение для второго класса SomeClass2.Free; будет произведена для несозданного SomeClass2.
Если в деструкторе SomeClass1 произойдет ошибка, то SomeClass2 не будет уничтожен.
Только не надо говорить, что конструкторы и деструкторы не генерят исключений. Зависит от объекта. Но лучше всегда делать правильно.
> И эта.. может проще так присваивать: P2^ := P1^;
Опять двадцать пять. Я ж говорю - специально так написал, чтобы человеку ясно было как обратиться к каждой цветовой составляющей. Я ж полагаю, что ему не тупое копирование битмапа нужно, а все таки какое - то преобразование цветовых составляющий.
Loginov Dmitry (2007-05-10 00:50:00) [9]А нафик здесь лишний try..finally?
И эта.. может проще так присваивать: P2^ := P1^;
DVM (2007-05-09 22:05:00) [10]
> У меня короче :
Так ему же, я думаю, что-то надо с пикселями делать будет. Твой вариант отпадает.
Я могу еще короче: BitBlt() :)
> Кстати, а почему растры не удаляешь ? :)))
Ему же нужен был пример для Scanline. Удаление объектов тут уже вторично. На коленке сбацал - вот и все. Ну уж если так хочется:
procedure TForm1.Button1Click(Sender: TObject);
type
TRGB = record
B, G, R: Byte;
end;
pRGB = ^TRGB;
var
x, y: integer;
p1, p2: pRGB;
SrcBmp, DstBmp: TBitmap;
begin
SrcBmp := TBitmap.Create;
try
SrcBmp.LoadFromFile('c:\test123.bmp');
DstBmp := TBitmap.Create;
try
DstBmp.Width := SrcBmp.Width;
DstBmp.Height := SrcBmp.Height;
DstBmp.PixelFormat := SrcBmp.PixelFormat;
for y := 0 to SrcBmp.Height - 1 do
begin
P1 := SrcBmp.ScanLine[y];
P2 := DstBmp.ScanLine[y];
for x := 0 to SrcBmp.Width-1 do
begin
P2^.r := P1^.R;
P2^.G := P1^.G;
P2^.B := P1^.B;
Inc(P1);
Inc(P2);
end;
end;
Canvas.Draw(0, 0, DstBmp);
finally
DstBmp.Free;
end;
finally
SrcBmp.Free;
end;
end;
Rial (2007-05-09 21:57:00) [11]У меня короче :
For I:=0 to SrcBmp.Height - 1 do
Move(SrcBmp.ScanLine[I]^, DstBmp.ScanLine[I]^);
%)
Кстати, а почему растры не удаляешь ? :)))
DVM (2007-05-09 21:48:00) [12]Не так написал, сорри, вот так надо:
procedure TForm1.Button1Click(Sender: TObject);
type
TRGB = record
B, G, R: Byte;
end;
pRGB = ^TRGB;
var
x, y: integer;
p1, p2: pRGB;
SrcBmp, DstBmp: TBitmap;
begin
SrcBmp := TBitmap.Create;
SrcBmp.LoadFromFile('c:\test123.bmp');
DstBmp := TBitmap.Create;
DstBmp.Width := SrcBmp.Width;
DstBmp.Height := SrcBmp.Height;
DstBmp.PixelFormat := SrcBmp.PixelFormat;
for y := 0 to SrcBmp.Height - 1 do
begin
P1 := SrcBmp.ScanLine[y];
P2 := DstBmp.ScanLine[y];
for x := 0 to SrcBmp.Width-1 do
begin
P2^.r := P1^.R;
P2^.G := P1^.G;
P2^.B := P1^.B;
Inc(P1);
Inc(P2);
end;
end;
Form1.Canvas.Draw(0, 0, DstBmp);
end;
homm (2007-05-09 21:44:00) [13]> возникла только опять праблема :( . цвет искажает. такое
> ощущение что image1 16 бит а image2 8 бит
У них палитры разные. Восьмибитные картинки все работают через палитру.
Rial (2007-05-09 21:42:00) [14]1. > [24] DVM © (09.05.07 21:32)
> SrcBmp.Width := 640;
> SrcBmp.Height := 480;
> SrcBmp.PixelFormat := pf24bit;
> SrcBmp.LoadFromFile('c:\test123.bmp');
Вот это пять баллов ! Хоть что- то заменит мне
радость салюта. :)
2. > Form1.Canvas.Draw(0, 0, SrcBmp);
"Form1" сотри.
3.Если картинка не 256 цветная, то размер данных
будет не равен (Байт) * (Ширина картинки).
DVM (2007-05-09 21:32:00) [15]Ничего не искажается - смотри сам:
procedure TForm1.Button1Click(Sender: TObject);
var
x, y: integer;
p1, p2: PByteArray;
SrcBmp, DstBmp: TBitmap;
begin
SrcBmp := TBitmap.Create;
SrcBmp.Width := 640;
SrcBmp.Height := 480;
SrcBmp.PixelFormat := pf24bit;
SrcBmp.LoadFromFile('c:\test123.bmp');
DstBmp := TBitmap.Create;
DstBmp.Width := SrcBmp.Width;
DstBmp.Height := SrcBmp.Height;
DstBmp.PixelFormat := SrcBmp.PixelFormat;
for y := 0 to SrcBmp.Height - 1 do
begin
P1 := SrcBmp.ScanLine[y];
P2 := DstBmp.ScanLine[y];
for x := 0 to SrcBmp.Width - 1 do
begin
P2^[x] := P1^[x];
end;
end;
Form1.Canvas.Draw(0, 0, SrcBmp);
end;
Dr.M@$ (2007-05-09 19:10:00) [16]Фуууууххх!! разобрался зделал так :
procedure TForm1.Button1Click(Sender: TObject);
var x,y:integer;
P1,p2 : PByteArray;
pp:TPoint;
begin
image1.Canvas;
image1.Picture.Bitmap.HandleType:=(bmDIB);
image1.Picture.LoadFromFile('D:\My Delphi5\DeeP II\bilding_3\bilding_pl20090.bmp');
image1.Picture.Bitmap.PixelFormat:=pf8bit;
image2.Canvas;
image2.Picture.Bitmap.HandleType:=(bmDIB);
image2.Picture.Bitmap.PixelFormat:=pf8bit;
for x := 0 to image1.Picture.Bitmap.Height -1 do
begin
P1 := image1.Picture.Bitmap.ScanLine[x];
P2 := image2.Picture.Bitmap.ScanLine[x];
for y := 0 to image1.Picture.Bitmap.Width -1 do
begin
P2[y]:=P1[y];
end;
end;
end;
возникла только опять праблема :( . цвет искажает. такое ощущение что image1 16 бит а image2 8 бит
Dr.M@$ (2007-05-09 18:38:00) [17]
>
> > P[x] := y;
>
> Вот тут только заменить на че нибудь более понятное.
так это все из хелпа! я ничего неменял ))
Dr.M@$ (2007-05-09 18:37:00) [18]я вначале искал на сайте.... успеха небыло. пришлось написать.
еще вопрос:
P := BitMap.ScanLine[y];
тоесть в "P" записываются все цвета находящиеся на строчке "Y" , длинной от 0 до BitMap.Height ? я прав?
если да , тоp[0..BitMap.Height]:=tcolorsя могу выстовлять свой цвет!?
DVM (2007-05-09 18:34:00) [19]
> так я и по хелпу смотрю... тап пример
И че тут непонятного?
> P[x] := y;
Вот тут только заменить на че нибудь более понятное.
Loginov Dmitry (2007-05-09 18:26:00) [20]Да уж. Извращенный пример в хепле.
По работе со ScanLine есть на этом сайте много информации. В статьях.