Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2015, 12:43   #1
z768
Пользователь
 
Регистрация: 21.11.2013
Сообщений: 45
По умолчанию Создание png из двух массивов ?

Есть два массива.
1 - массив индексированных цветов array [0..255] of cardinal
2 - сами индексы

Нужно создать файл *.png в формате 256 - color.
Сорри, поиск по форуму и в инете толкового ничего не дал.
С форматом png практически не сталкивался.
z768 вне форума Ответить с цитированием
Старый 19.12.2015, 13:16   #2
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Создаешь битмап, задаешь ему размеры, заполняешь пискели нужным цветом тебе,
певедиш его в восьмибитное изображение, скармливаешь его ПНГ компоненту, профит.

Код:
Var
  bmp:TBitmap;
begin
  bmp:=Tbitmap.create;
  bmp.pixelformat:=pf24bit;
  bmp.height:=16;
  bmp.width:=16;  
  for i:=0 to 16 do
  for j:=0 to 16 do
  begin
    bitmap.pixels[i,j]:=ColorArray[j+i*16];
  end;
  ...
  bmp.free;
end;
Писал быстро на коленке, чтобы показать суть.
IvaniuS вне форума Ответить с цитированием
Старый 19.12.2015, 13:24   #3
z768
Пользователь
 
Регистрация: 21.11.2013
Сообщений: 45
По умолчанию

Хотелось бы обойти битмап....
И просто напрямую "скормить" массивы в png.
Тем более, что индексированные цвета известны, и тело файла, размеры и сам массив байт тоже известен.
z768 вне форума Ответить с цитированием
Старый 19.12.2015, 13:43   #4
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Я думаю у пнг, есть такой же битмап как и у всех для отображения.
Начни с поиска самого компонента.
IvaniuS вне форума Ответить с цитированием
Старый 19.12.2015, 14:05   #5
z768
Пользователь
 
Регистрация: 21.11.2013
Сообщений: 45
По умолчанию

Зачем искать компонент, если у меня d2010, он уже реализован.
Просто не могу понять как заполнить индексированную палитру, ну и еще пару моментов не понятны.
Код:
Chunk := TChunkPLTE(png.Chunks.ItemFromClass(TChunkPLTE));
                  for i := 0 to 255 do
                    begin
                      Chunk.Item[i].rgbBlue := ???
                      Chunk.Item[i].rgbGreen := ???
                      Chunk.Item[i].rgbRed := ???
                      Chunk.Item[i].rgbReserved := ???
                    end;
на место вопросов нужно вставить байт, полученный из кардинал, для определенного цвета, вроде как-то так...
Но не уверен что реализация верна.
z768 вне форума Ответить с цитированием
Старый 19.12.2015, 14:57   #6
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

аа тю, так есть функция GetRValue, GetGValue, getBValue все они принимают Cardinal а выдают уже твое значение
IvaniuS вне форума Ответить с цитированием
Старый 19.12.2015, 15:26   #7
z768
Пользователь
 
Регистрация: 21.11.2013
Сообщений: 45
По умолчанию

[DCC Error] uBitmap.pas(821): E2064 Left side cannot be assigned to
Подставляю просто значения вместо вопросов $00 и т.п.
z768 вне форума Ответить с цитированием
Старый 19.12.2015, 16:30   #8
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Какой тип у пропети rgbBlue, в теории это должен быть Byte, а то что я предоставил возвращает именно его..
IvaniuS вне форума Ответить с цитированием
Старый 19.12.2015, 17:56   #9
z768
Пользователь
 
Регистрация: 21.11.2013
Сообщений: 45
По умолчанию

при наведении курсора пишет System.Byte
z768 вне форума Ответить с цитированием
Старый 21.12.2015, 10:25   #10
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  png: TPNGImage;
  pal: TMaxLogPalette;
  scan: pByteArray;
  x,y: integer;
const
  xmax=256;
  ymax=256;
begin
  png:=TPNGImage.CreateBlank(COLOR_PALETTE, 8, xmax, ymax);
  with pal do begin
    palVersion:=$300;
    palNumEntries:=256;
    for x:=0 to palNumEntries-1 do begin
      palPalEntry[x].peRed:=x;
      palPalEntry[x].peGreen:=x;
      palPalEntry[x].peBlue:=x;
      palPalEntry[x].peFlags:=0;
    end;
  end;
  png.Palette:=CreatePalette(PLogPalette(@pal)^);
  for y:=0 to ymax-1 do begin
    scan:=png.Scanline[y];
    for x:=0 to xmax-1 do begin
      scan[x]:=x;
    end;
  end;
  png.SaveToFile('test.png');
  png.Free;
end;
x128 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арифметическое деление двух массивов в два байта, как двух целых чисел Ixmil Паскаль, Turbo Pascal, PascalABC.NET 8 28.09.2015 08:36
Связь двух массивов victorixx Общие вопросы Delphi 9 19.02.2014 06:48
Сортировка двух массивов saggy Общие вопросы Delphi 9 13.06.2012 22:07
Слияние двух массивов Anubys Общие вопросы C/C++ 5 28.03.2011 10:07
Слияние двух массивов Anubys Помощь студентам 0 26.03.2011 16:12