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

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

PNG в Delphi


danila_master ©   (2007-02-21 22:28:00) 

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


Danila_master   (2007-02-22 16:49:00) [1]

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


Efir   (2007-02-22 16:33:00) [2]

Не забывай про кол-во бит на пиксель. Ведь при 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 15:21:00) [3]

помогите опять проблемка, точнее все таже самая.
Написл такой код:
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. Как сделать, что бы она полностью выводилась?


Danila_master   (2007-02-22 13:50:00) [4]

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


Efir   (2007-02-22 13:01:00) [5]

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

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 12:51:00) [6]

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


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

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


Danila_master   (2007-02-22 12:11:00) [8]

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


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


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

google.com


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

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


Efir   (2007-02-21 23:40:00) [11]

Используй какокй нить компонент, напр. 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-21 23:10:00) [12]

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


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

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


Наверх

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