2014-10-02 5 views
1

Я новичок в языке программирования Ada, я хочу читать и обрабатывать изображения в Ada без привязки к другим библиотекам, таким как opencv. Есть ли способ читать изображения в Аде? Или преобразовать его в значения пикселей (RGB), особенно растровые изображения. Я сделал вышеуказанный тип для сохранения изображений растровых изображений, но я не знаю, как читать изображение и заполнять свой тип изображения.Как читать изображение в Аде?

type Byte is range 0..255; 

    for Byte'Size use 8; 

    type Pixel is record 

    R:Byte; 

    G:Byte; 

    B:Byte; 

    end record; 

    for Pixel'Size use 24; 

    type Image is array(Positive range <>, Positive range <>) of Pixel; 

    Pragma Pack(Image); 
+0

Ваш вопрос близок к закрытию за то, что он слишком широк, выходит за рамки или неясен. Поскольку вы уже определили «правильный тип» для хранения изображения, вы можете улучшить вопрос, разместив * это * и спросив, как его заполнить. –

+0

Почему вы не хотите использовать существующую библиотеку? –

+0

Я собираюсь сделать некоторую обработку изображений на плате GIMME2, используя библиотеки привязки, является плохой идеей –

ответ

0

Если вы не хотите, чтобы связать другие библиотеки, вы должны написать свой собственный читатель и хранить данные в формате пикселя. Тогда вы можете делать все, что хотите. В зависимости от формата ввода это либо простая, либо относительно сложная задача. Если вас больше всего интересуют файлы BMP, удача на вашей стороне, потому что это особенно простой формат и состоит в основном из заголовка, за которым следуют данные. Я читал книгу сам себе несколько лет назад, и это было довольно просто. Вы найдете определение формата всюду в Интернете, например here в Википедии. Если я правильно помню, изображения BMP сохраняются «снизу вверх», поэтому при чтении изображения вам придется инвертировать Y-строки, так как большинство людей предпочитает, чтобы верхняя строка была первой в массиве или любой другой структуре, которую вы выбрали.

+0

Спасибо за ваш комментарий, да, я имею дело с изображениями bmp, но проблема в том, что я новичок в Ada, и я не знаю, как читать Я создал правильный тип для хранения изображения, но я не знаю, как его прочитать. если бы я мог прочитать изображение, тогда остальное будет легко –

+0

Посмотрев на ссылку в Википедии, я должен сказать, что чтение BMP выглядит не очень просто! –

1

Вы можете увидеть два примера для чтения полного файла на Rosetta Код: http://rosettacode.org/wiki/Read_entire_file#Ada

После того, как вы прочитали файл, это «просто» вопрос интерпретации файла в соответствии с соответствующим форматом файла.

1

Определение 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 или любой формат. Самый близкий, который я знаю, чтобы понять формат пикселя, - это проверить размер пикселя, но не отображает порядок цветовых компонентов.

Смежные вопросы