Форум: "Начинающим";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];
Внизread write pixel (hight fps) Найти похожие ветки
← →
Dr.M@$ © (2007-05-06 22:30) [0]Подскажите пожайлуста как из битмапа прочитать или записать пиксель но чтоб это быстро работало
picture.canvas.getpixe работает ооооочень медленно.
← →
DVM © (2007-05-06 22:36) [1]Scanline
← →
homm © (2007-05-06 23:01) [2]> [1] DVM © (06.05.07 22:36)
> Scanline
Предворительно сделай его DIB — эффект удвоется :)
← →
Dr.M@$ © (2007-05-07 15:18) [3]Большое спасибо, пойду пробывать
← →
Dr.M@$ © (2007-05-07 18:35) [4]И снова здравствуйте! делаю следующее
procedure TForm1.Button1Click(Sender: TObject);
var x,y:integer;
p_color:pointer;
begin
x:=1;
image1.Picture.Bitmap.HandleType:=(bmDIB);
p_color:=image1.Picture.Bitmap.ScanLine[x];
end;
и при на жатии Button1 выдает ошибку out of range scaneline.... где я неправ?
← →
Loginov Dmitry © (2007-05-07 20:50) [5]> где я неправ?
Очевидно, тута: image1.Picture.Bitmap.HandleType:=(bmDIB);
← →
Dr.M@$ © (2007-05-08 14:17) [6]:) и что мне делать?
← →
homm © (2007-05-08 22:03) [7]> :) и что мне делать?
Написать вот так, что-бы хотя-бы создать отъект, к полям которого ты собираешь обращаться:procedure TForm1.Button1Click(Sender: TObject);
var x,y:integer;
p_color:pointer;
begin
x:=1;
image1.Canvas;
image1.Picture.Bitmap.HandleType:=(bmDIB);
p_color:=image1.Picture.Bitmap.ScanLine[x];
end;
← →
Dr.M@$ © (2007-05-09 17:12) [8]пошел пробывать ...
← →
Dr.M@$ © (2007-05-09 17:16) [9]и вновь возник вопрос... даже два:
1) image2.Picture.Bitmap.ScanLine[x]:=image1.Picture.Bitmap.ScanLine[x]; неполучается
2) как мне получить максимальное сначение X?
а в осталном вродебы все ок.
← →
Rial © (2007-05-09 17:23) [10]1.> image2.Picture.Bitmap.ScanLine[x]
Это есть указатель на массив данных.
P1, P2 : ^Array of Byte;
Как переместить в данных случае данные
из P1 в P2 знаешь ?
2. Max(x) = Bitmap.Height
← →
Dr.M@$ © (2007-05-09 17:48) [11]>Как переместить в данных случае данные
из P1 в P2 знаешь ?
наверное нет..
← →
Dr.M@$ © (2007-05-09 17:49) [12]мне просто нужно с одной картинки всять пиксель а в другую его поставить :(
← →
Dr.M@$ © (2007-05-09 18:06) [13]что-то я вообще немогу понять как ведет себя команда ScanLine.!!! она что пиксель читает или нет? или работает как-то по другому.
← →
Efir © (2007-05-09 18:08) [14]Она получает указатель на начало строки.
← →
Rial © (2007-05-09 18:09) [15]Дает указатель на строку пикселей с координатой Y = Y.
← →
Loginov Dmitry © (2007-05-09 18:15) [16]> что-то я вообще немогу понять как ведет себя команда ScanLine.!
> !! она что пиксель читает или нет? или работает как-то по
> другому.
хэлп на что нам дан свыше?
← →
Dr.M@$ © (2007-05-09 18:15) [17]похоже я так и ничего невкурю пока не пощупаю исходник :(
← →
Dr.M@$ © (2007-05-09 18:17) [18]так я и по хелпу смотрю... тап пример
var
x,y : Integer;
BitMap : TBitMap;
P : PByteArray;
begin
BitMap := TBitMap.create;
try
BitMap.LoadFromFile("C:\Program Files\Common Files\Borland Shared\Images\Splash\256color\factory.bmp");
for y := 0 to BitMap.Height -1 do
begin
P := BitMap.ScanLine[y];
for x := 0 to BitMap.Width -1 do
P[x] := y;
end;
Canvas.Draw(0,0,BitMap);
finally
BitMap.Free;
end;
end;
← →
Loginov Dmitry © (2007-05-09 18:26) [19]Да уж. Извращенный пример в хепле.
По работе со ScanLine есть на этом сайте много информации. В статьях.
← →
DVM © (2007-05-09 18:34) [20]
> так я и по хелпу смотрю... тап пример
И че тут непонятного?
> P[x] := y;
Вот тут только заменить на че нибудь более понятное.
← →
Dr.M@$ © (2007-05-09 18:37) [21]я вначале искал на сайте.... успеха небыло. пришлось написать.
еще вопрос:
P := BitMap.ScanLine[y];
тоесть в "P" записываются все цвета находящиеся на строчке "Y" , длинной от 0 до BitMap.Height ? я прав?
если да , тоp[0..BitMap.Height]:=tcolors
я могу выстовлять свой цвет!?
← →
Dr.M@$ © (2007-05-09 18:38) [22]
>
> > P[x] := y;
>
> Вот тут только заменить на че нибудь более понятное.
так это все из хелпа! я ничего неменял ))
← →
Dr.M@$ © (2007-05-09 19:10) [23]Фуууууххх!! разобрался зделал так :
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 бит
← →
DVM © (2007-05-09 21:32) [24]Ничего не искажается - смотри сам:
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;
← →
Rial © (2007-05-09 21:42) [25]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 цветная, то размер данных
будет не равен (Байт) * (Ширина картинки).
← →
homm © (2007-05-09 21:44) [26]> возникла только опять праблема :( . цвет искажает. такое
> ощущение что image1 16 бит а image2 8 бит
У них палитры разные. Восьмибитные картинки все работают через палитру.
← →
DVM © (2007-05-09 21:48) [27]Не так написал, сорри, вот так надо:
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;
← →
Rial © (2007-05-09 21:57) [28]У меня короче :
For I:=0 to SrcBmp.Height - 1 do
Move(SrcBmp.ScanLine[I]^, DstBmp.ScanLine[I]^);
%)
Кстати, а почему растры не удаляешь ? :)))
← →
DVM © (2007-05-09 22:05) [29]
> У меня короче :
Так ему же, я думаю, что-то надо с пикселями делать будет. Твой вариант отпадает.
Я могу еще короче: 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;
← →
Loginov Dmitry © (2007-05-10 00:50) [30]А нафик здесь лишний try..finally?
И эта.. может проще так присваивать: P2^ := P1^;
← →
DVM © (2007-05-10 07:32) [31]
> 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^;
Опять двадцать пять. Я ж говорю - специально так написал, чтобы человеку ясно было как обратиться к каждой цветовой составляющей. Я ж полагаю, что ему не тупое копирование битмапа нужно, а все таки какое - то преобразование цветовых составляющий.
← →
DVM © (2007-05-10 10:19) [32]
> Если в конструкторе первого класса произойдет исключение...
это я загнул, конечно, спросоня :).
← →
Loginov Dmitry © (2007-05-10 10:56) [33]> Например следующий код может привести к ошибкам:
Теоретически. Но практически исключение в конструкторе для TBitmap произойти не может. Противоположность ему - TFileStream.
Также исключение не может произойти для TMemoryStream, TList, TStringList и т.п. Ислючение в конструкторе практически может произойти для TComponent и всех наследников, а также для всех объектов, для которых в конструкторе назначается владелец.
Так что если ли толк он лишних try..finally? Думаю, что нет!
← →
DVM © (2007-05-10 11:13) [34]
> Но практически исключение в конструкторе для TBitmap произойти
> не может.
Именно для битмапа согласен. Но за остальные классы не ручаюсь. А так как изучать деструктор каждого класса vcl мне не очень интересно, так же изучать деструкторы всех объектов, которые написаны другими прогаммистами, то лучше писать одинаково везде - хуже от этого не будет.
> Так что если ли толк он лишних try..finally? Думаю, что
> нет!
Это скорее благо, чем зло. Вырабатывает привычку писать программы без утечек памяти и прочее. Я сторонник подхода - лучше лишний раз проверить что-то если неуверен, чем полагаться на авось. Т.е я лучше лишний IF поставлю или try.
← →
Anatoly Podgoretsky © (2007-05-10 16:50) [35]> DVM (10.05.2007 07:32:31) [31]
Если в конструкторе 1 или
втором произойдет
исключения, то до finally дело
не дойдет
← →
DVM © (2007-05-10 16:54) [36]
> Anatoly Podgoretsky © (10.05.07 16:50) [35]
я поправился же в [32]
← →
Anatoly Podgoretsky © (2007-05-10 18:29) [37]> DVM (10.05.2007 16:54:36) [36]
Не вижу, там что то про сон только.
← →
Dr.M@$ © (2007-05-10 19:18) [38]ээээ-э-э-э!!! Люди ! вы о чем ??!! :) этотрздел форума был исключительно по ScanLine!!! Хотя признаюсь чт ваши диалоги читать было приятно.
> > И эта.. может проще так присваивать: P2^ := P1^;
>
> Опять двадцать пять. Я ж говорю - специально так написал,
> чтобы человеку ясно было как обратиться к каждой цветовой
> составляющей. Я ж полагаю, что ему не тупое копирование
> битмапа нужно, а все таки какое - то преобразование цветовых
> составляющий.
Тут ты прав. Это самое главное для меня. Я делал для предприятия программу сканирования продукции... Программа опредиляла тип продукции(камера и карта видеозахвата), цвет(цветавой диапозон камеры), и высоту (использовал лазер). но прга с скоростью конвеера неспровлялась. так как я использовал соманды canvas.pixel[x,y]; и вот терперь очень нужно всю мою старую идею "перелопатить"... а с канвой я на вы! всегда все делал при помощи DirectX & OpenGL... и то вставлял спрайты и 3д обьекты... www.netherearth.narod.ru это не риклама. это пример... :) Всем спасибо! считаю тему исчерпаной.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.059 c