Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.56 MB
Время: 0.116 c
6-1163059228
Kr_H|6apa6aH
2006-11-09 11:00
2007.05.27
MAC адрес в offline


9-1151428609
bulavkin
2006-06-27 21:16
2007.05.27
DelphiX --- Движение спрайта


2-1178531293
Doom-2
2007-05-07 13:48
2007.05.27
Проект вызвал исключение EStringListError


2-1178623839
JajaBinks
2007-05-08 15:30
2007.05.27
open dealog и listbox


2-1178715659
Sapos
2007-05-09 17:00
2007.05.27
Таймаут





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский