Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

read write pixel (hight fps) [D5, D6, 95/98, ME, XP]


Страницы:   1 2

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 есть на этом сайте много информации. В статьях.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо