Определение BMP заголовки
Information о заголовке.
with Interfaces; use Interfaces;
package BMP is
type Header is record
Signature : Integer_16;
Size : Integer_32; -- File size in bytes
Reserved1 : Integer_16;
Reserved2 : Integer_16;
Offset : Integer_32; -- Start address in bytes where the image data can be found.
end record;
Information о информации заголовка
type Info is record
Struct_Size : Integer_32;
Width : Integer_32; -- Image width in pixels
Height : Integer_32; -- Image hieght in pixels
Planes : Integer_16;
Pixel_Size : Integer_16; -- Bits per pixel
Compression : Integer_32; -- Zero means no compression
Image_Size : Integer_32; -- Size of the image data in bytes
PPMX : Integer_32; -- Pixels per meter in x led
PPMY : Integer_32; -- Pixels per meter in y led
Palette_Size : Integer_32; -- Number of colors
Important : Integer_32;
end record;
Есть много типов пикселей. Вот два типа:
type Pixel_G8 is new Integer_8; -- 8 bit pixel grayscale
type Image_G8 is array (Integer range <>) of Pixel_G8;
type Pixel_ARGB32 is record -- 32 bit pixel (alpha, red, green, blue)
A, R, G, B : Integer_8; -- 8 bit * 4 = 32 bit
end record;
type Image_ARGB32 is array (Integer range <>) of Pixel_ARGB32;
Как получить данные в типы
Ada.Streams.Stream_IO позволяет читать в разного типа от того же объекта файла, используя атрибут Read. Подробнее info о разных IO.
with Ada; use Ada;
with Ada.Text_IO;
with Ada.Streams.Stream_IO;
use Ada.Streams;
with BMP;
procedure Test_BMP is
File : Stream_IO.File_Type;
Stream : Stream_IO.Stream_Access;
Header : BMP.Header;
Info : BMP.Info;
Name : constant String := "lena512.bmp";
begin
Stream_IO.Open(File, Stream_IO.In_File, Name);
Stream := Stream_IO.Stream(File);
BMP.Header'Read(Stream, Header);
Text_IO.Put_Line("Signature " & Header.Signature'Img);
Text_IO.Put_Line("Size " & Header.Size'Img);
Text_IO.Put_Line("Reserved1 " & Header.Reserved1'Img);
Text_IO.Put_Line("Reserved2 " & Header.Reserved2'Img);
Text_IO.Put_Line("Offset " & Header.Offset'Img);
BMP.Info'Read(Stream, Info);
Text_IO.Put_Line("Struct_Size " & Info.Struct_Size'Img);
Text_IO.Put_Line("Width " & Info.Width'Img);
Text_IO.Put_Line("Height " & Info.Height'Img);
Text_IO.Put_Line("Planes " & Info.Planes'Img);
Text_IO.Put_Line("Pixel_Size " & Info.Pixel_Size'Img);
Text_IO.Put_Line("Compression " & Info.Compression'Img);
Text_IO.Put_Line("Image_Size " & Info.Image_Size'Img);
Text_IO.Put_Line("PPMX " & Info.PPMX'Img);
Text_IO.Put_Line("PPMY " & Info.PPMY'Img);
Text_IO.Put_Line("Palette_Size " & Info.Palette_Size'Img);
Text_IO.Put_Line("Important " & Info.Important'Img);
delay 2.0;
-- Move read pointer to where the image data starts.
Stream_IO.Set_Index(File, Stream_IO.Positive_Count(Header.Offset));
declare
subtype Image is BMP.Image_G8(1..Integer(Info.Image_Size));
I : Image;
begin
Image'Read(Stream, I);
Stream_IO.Close(File);
for P of I loop
Text_IO.Put(P'Img);
end loop;
end;
end;
Sidenote
Если Info.Compression не равно нулю, вам придется распаковывать данные изображения. Я не знаю, как сейчас, поэтому я не буду объяснять. Но вы можете придерживаться несжатого BMP.
Я не знаю, как проверить формат RGB или GBR или любой формат. Самый близкий, который я знаю, чтобы понять формат пикселя, - это проверить размер пикселя, но не отображает порядок цветовых компонентов.
Ваш вопрос близок к закрытию за то, что он слишком широк, выходит за рамки или неясен. Поскольку вы уже определили «правильный тип» для хранения изображения, вы можете улучшить вопрос, разместив * это * и спросив, как его заполнить. –
Почему вы не хотите использовать существующую библиотеку? –
Я собираюсь сделать некоторую обработку изображений на плате GIMME2, используя библиотеки привязки, является плохой идеей –