Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何在Ada中读取图像?_Image_Image Processing_Computer Vision_Ada - Fatal编程技术网

Image 如何在Ada中读取图像?

Image 如何在Ada中读取图像?,image,image-processing,computer-vision,ada,Image,Image Processing,Computer Vision,Ada,我是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

我是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);
类型字节的范围为0..255;
对于字节大小,使用8;
类型像素是记录
R:字节;
G:字节;
B:字节;
结束记录;
像素大小使用24;
类型图像是像素的数组(正范围、正范围);
布拉格语包(图片);

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

您可以看到两个读取有关Rosetta代码的完整文件的示例:


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

定义bmp标题

关于标题

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;
关于信息标题

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;
旁注

如果信息压缩不是零,则必须解压缩图像数据。我不知道目前情况如何,所以我不会解释。但您可以坚持使用未压缩的bmp


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

谢谢你的评论,是的,我正在处理bmp图像,但问题是我是Ada新手,我不知道如何读取图像我创建了一个适当的类型来存储图像,但我不知道如何读取它。如果我能读懂这张图片,那么剩下的就很容易了。看看维基百科的参考文献,我不得不说读懂BMP看起来并不特别简单!你的问题因为太宽泛、超出范围或不清楚而接近结束。既然你已经定义了一个“合适的类型”来存储图像,你可以通过发布并询问如何填充来改进这个问题。为什么你不想使用现有的库呢?我将使用绑定库在GIMME2板上进行一些图像处理是个坏主意
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;