【问题标题】:how to read image in Ada?如何在 Ada 中读取图像?
【发布时间】:2014-10-02 18:51:46
【问题描述】:

我是 Ada 编程语言的新手,我想在 Ada 中读取和操作图像而不绑定其他库,如 opencv。 有没有办法在 Ada 中读取图像?或者将其转换为像素值 (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);

【问题讨论】:

  • 您的问题因过于宽泛、超出范围或不清楚而接近关闭。由于您已经定义了存储图像的“正确类型”,您可以通过发布 that 并询问如何填充它来改进问题。
  • 为什么不想使用现有的库?
  • 我将使用绑定库在 GIMME2 板上进行一些图像处理是个坏主意

标签: image image-processing computer-vision ada


【解决方案1】:

您可以在 Rosetta Code 上看到两个读取完整文件的示例:http://rosettacode.org/wiki/Read_entire_file#Ada

一旦您阅读了文件,“只是”根据相关文件格式解释文件。

【讨论】:

    【解决方案2】:

    定义 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;
    

    旁注

    如果 Info.Compression 不为零,则必须解压缩图像数据。我不知道目前如何,所以我不会解释。但你可以坚持使用未压缩的 bmp。

    我不知道如何检查格式是 RGB 还是 GBR 或任何格式。我知道最接近解释像素格式的是检查像素大小,但不显示颜色分量的顺序。

    【讨论】:

      【解决方案3】:

      如果您不想绑定其他库,则必须编写自己的阅读器并将数据以像素格式存储。然后你可以用它做任何你想做的事情。 根据输入格式,这是一项简单或相对复杂的任务。 如果您对 BMP 文件最感兴趣,那么幸运就在您身边,因为它是一种特别简单的格式,基本上由标题和数据组成。几年前我自己用 C 语言做了一个阅读器,它相当简单。 您可以在网络上随处找到格式定义,例如 Wikipedia 上的 here。如果我没记错的话,BMP 图像是“自下而上”存储的,因此当您阅读图片时,您必须反转 Y 行,因为大多数人更喜欢将第一行放在数组或您选择的任何结构中。

      【讨论】:

      • 感谢您的评论,是的,我正在处理 bmp 图像,但问题是我是 Ada 的新手,我不知道如何读取图像我创建了一个合适的类型来存储图像但是我不知道怎么读。如果我能读懂图片,那么剩下的就很容易了
      • 看了 Wikipedia ref,不得不说读 BMP 看起来不是特别简单!
      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 2014-10-29
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多