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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.045 c
11-1160134748
Thaddy
2006-10-06 15:39
2007.05.27
tip to reduce memory when inactive.


15-1177436016
Kerk
2007-04-24 21:33
2007.05.27
Дайте чтоль похвалюсь :))


1-1174823514
Alexey (AZ)
2007-03-25 15:51
2007.05.27
Dispose pointer variable by nil?


1-1175153464
DelphiLexx
2007-03-29 11:31
2007.05.27
Изменить родителя при наследование


2-1178401907
ctudent
2007-05-06 01:51
2007.05.27
Что это?