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

Вниз

PNG в Delphi   Найти похожие ветки 

 
danila_master ©   (2007-02-21 22:28) [0]

Всем првет,
может кто подскажет, как png файл загнать в динамический массив? (например в array of real)


 
Dmitrij_K   (2007-02-21 22:58) [1]

Чего? Модет опишешь проблему подругому. Как связан рисунок и массив чисел?


 
danila_master ©   (2007-02-21 23:10) [2]

Ну как я понимаю,
во-первых: надо вообще загрузить png  в delphi.
во-вторых: как я понимаю загрузить битовую карту в массив.
Если я в чем-то ошибаюсь, то исправьте меня.


 
Efir ©   (2007-02-21 23:40) [3]

Используй какокй нить компонент, напр. TPNGImage. Грузишь, переводишь в TBitmap, а далее можно так:

var
 mas:array of array of byte;
 pix:TByteArray;
 Image:TBitmap;

SetLength(mas,Image.Width*n,Image.Height*n);
for y:=0 to Height-1 do begin
 pix:=Image.ScanLine[y];
 for x:=0 to Width-1 do mas[x,y]:=pix[x];
end;

где n - битность изображения (от1 до 3)


 
Danila_master ©   (2007-02-22 10:48) [4]

А это где такой компонент взять?
Или это надо самому его писать?
Или может каки-нить библиотеки подключить?


 
Dmitrij_K   (2007-02-22 11:54) [5]


> А это где такой компонент взять?

google.com


 
Danila_master ©   (2007-02-22 12:11) [6]

Спасибо скачал, буду разбираться.
А кто подскажет как можно сделать обратную процедуру из массива в bmp или Image, для проверки?


 
Efir ©   (2007-02-22 12:39) [7]

Тоже, как в [3], только вместо mas[x,y]:=pix[x] надо pix[x]:=mas[x,y]


 
Danila_master ©   (2007-02-22 12:51) [8]

Не понял, а как с PByteArray вывести в bmp или Image?


 
Efir ©   (2007-02-22 13:01) [9]

Ну написал же. Создаёшь свой битмап нужного размера

Image:=TBitmap.Create;
Image.PixelFirmat:=нужный тебе
Image.Width:=W;
Image.Height:=H;

Кидаешь на него указатель на нужную строчку  (pix:=Image.ScanLine[y]) и заполняешь.

for y:=0 to H-1 do begin
pix:=Image.ScanLine[y];
for x:=0 to W-1 do pix[x]:=mas[x,y];
end;


 
Danila_master ©   (2007-02-22 13:50) [10]

Большое спасибо, все получилось.


 
Danila_master ©   (2007-02-22 15:21) [11]

помогите опять проблемка, точнее все таже самая.
Написл такой код:
var
 x,y : integer;
 bmp, bmp2 : TBitmap;
 png: TPNGObject;

 mas:array of array of byte;
 pix : PByteArray;
begin
 bmp := TBitmap.create;
 bmp2 := TBitmap.create;
 png := TPNGObject.create;
 try
   png.LoadFromFile("_img.png");
   bmp.Assign(png);
   bmp2.PixelFormat:=pf24bit;
   bmp2.Width:=bmp.Width;
   bmp2.Height:=bmp.Height;

   Image1.Picture.Bitmap := bmp;

   SetLength(mas,bmp.Width,bmp.Height);
   for y:=0 to bmp.Height-1 do
   begin
      pix:=bmp.ScanLine[y];
      for x:=0 to bmp.Width-1 do mas[x,y]:=pix[x];
   end;
   for y:=0 to bmp2.Height-1 do begin
     pix:=bmp2.ScanLine[y];
     for x:=0 to bmp2.Width-1 do pix[x]:=mas[x,y];
   end;
   Image2.Picture.Bitmap := bmp2;
 finally
   bmp.free;
   bmp2.free;
 end;
end;

все работает, только картинку не полностью рисует, изменил byte на word и PByteArray на PWordArray, стал рисовать больше, но все равно не все. Размер картинки 512х512. Как сделать, что бы она полностью выводилась?


 
Efir ©   (2007-02-22 16:33) [12]

Не забывай про кол-во бит на пиксель. Ведь при RGB у тебя 3 компоненты, следовательно и ширину массива byte умножай на три. Т.е.:

SetLength(mas,bmp.Width*3,bmp.Height);

for y:=0 to bmp.Heigth-1 do begin
 pix:=bmp.ScanLine[y];
 for x:=0 to bmp.Width*3-1 do ...
end;

А для RGB можно и так:

type
 RGB = record
   B,G,R:byte;
 end;

var
 pix:^RGB;

for y:=0 to bmp.Heigth-1 do begin
 pix:=bmp.ScanLine[y];
 for x:=0 to bmp.Width-1 do begin
   pix^.R:=...
   pix^.G:=...
   pix^.B:=...
   inc(pix);
 end;
end;


 
Danila_master ©   (2007-02-22 16:49) [13]

Большое спасибо. все получилось.



Страницы: 1 вся ветка

Текущий архив: 2007.03.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
2-1172150387
Lonix
2007-02-22 16:19
2007.03.18
Помощь с сеткой на форме


15-1171798982
Чапаев
2007-02-18 14:43
2007.03.18
что для вас иконка в трее (там где часы)?


15-1172354916
Kair+
2007-02-25 01:08
2007.03.18
MySQL + DateTime


11-1150321912
parovoZZ
2006-06-15 01:51
2007.03.18
KOLDataModule - поясните


8-1152792575
Leshka_t
2006-07-13 16:09
2007.03.18
программно воспроизвести видео на ТВ