Delphi 转换;图片“/&引用;“图像”;我自己的格式

Delphi 转换;图片“/&引用;“图像”;我自己的格式,delphi,graphics,Delphi,Graphics,给定一个图像(格式是问题的一部分),我希望能够将其转换为我的“格式”。我的格式是,比方说,一个简单的X×Y布尔数组,覆盖时间图像的大小,说明特定像素是否“开启”。颜色是无关紧要的。我对图像格式(如BMP、JPG、GIF)一无所知,因此如果给定其中任何一种格式,就可以读取图像,然后“映射”该像素状态 我猜困难可能是在图像中确定某个特定像素是否“开启”。由于这是我正在创建的程序的特定部分的一部分,因此我可以确保用户仅以单一颜色和特定范围创建他们的图像。如通常的红色、绿色、黄色等 我试图实现的是让用户

给定一个图像(格式是问题的一部分),我希望能够将其转换为我的“格式”。我的格式是,比方说,一个简单的X×Y布尔数组,覆盖时间图像的大小,说明特定像素是否“开启”。颜色是无关紧要的。我对图像格式(如BMP、JPG、GIF)一无所知,因此如果给定其中任何一种格式,就可以读取图像,然后“映射”该像素状态

我猜困难可能是在图像中确定某个特定像素是否“开启”。由于这是我正在创建的程序的特定部分的一部分,因此我可以确保用户仅以单一颜色和特定范围创建他们的图像。如通常的红色、绿色、黄色等

我试图实现的是让用户使用他们想要的任何图像程序(如mspaint)绘制他们的图像,然后保存并在以后将其导入到我的应用程序中

有任何图形格式允许我这样做吗?我希望我已经提供了足够的信息为我所追求的。我将提供一个非常基本的例子

例如:创建的图像是20,10,用户从点0,0->6,0(即7像素宽)绘制了一条直线。他们把它保存成BMP,JPG之类的。然后我想打开那个图像,扫描它,基本上确定是否画了一个特定的像素。因此,像素0,01,02,03,04,05,06,0将“打开”,而所有其他像素将关闭。如果我不得不强迫他们将其保存为特定类型,我对此感到高兴

我使用Delphi作为我的开发语言

谢谢


Jason

使用Delphi,您可以直接加载几种不同的图像格式(BMP、JPG、PNG、GIF,我想现在也是这样)。还有很多第三方选项可用于支持其他图像类型

一旦将图像加载到内存中,最简单的方法就是将其转换为Tbitmap。也有一些方法可以做到这一点。但是因为你想弄乱像素,我会创建一个Tbitmap,并将它的像素格式设置为24位,然后我会将你加载的图像绘制到Tbitmap的画布上

bmp.Width:=sourecimage.Width;
bmp.Height:=sourceimage.Height;
bmp.PixelFormat:=pf24bit;
bmp.Canvas.Draw(0,0,sourceimage);
虽然这可能不是最有效的方法,但它会在内存中获得一个已知格式的图像,您只需要担心使用它的一种方法,而不是为不同的格式编码

现在,您有2个选项可用于访问图像信息: -像素属性(速度非常慢,但易于理解) -扫描线属性(速度快,但使用起来有点复杂)

这两种方法都允许您迭代图像中的所有像素并确定它们的颜色

现在你已经有了像素,你需要找出什么定义像素为“开”,什么定义像素为“关”。为此,我认为您必须选择一种颜色来表示“关闭”像素(例如白色-$FFFFFF),因此如果像素是该颜色,那么它将关闭,否则它将打开

如果你不太了解自己真正想要实现的目标,就很难再进一步了。您需要性能还是简单?您是否真的需要自己的结构,或者仅仅是位图数据(实际上是一个二维数组)就足够了


还有一个重要的提示。使用JPG文件是不好的。JPG使用近似的颜色,没有办法(我知道)保证在压缩/解压缩图像后加载什么颜色。虽然你的“关闭”像素可能是“接近白色”,但不能保证它们是“完全白色的”。

开箱即用,你可以用Delphi加载几种不同的图像格式(BMP、JPG、PNG、GIF,我想现在也是这样)。还有很多第三方选项可用于支持其他图像类型

一旦将图像加载到内存中,最简单的方法就是将其转换为Tbitmap。也有一些方法可以做到这一点。但是因为你想弄乱像素,我会创建一个Tbitmap,并将它的像素格式设置为24位,然后我会将你加载的图像绘制到Tbitmap的画布上

bmp.Width:=sourecimage.Width;
bmp.Height:=sourceimage.Height;
bmp.PixelFormat:=pf24bit;
bmp.Canvas.Draw(0,0,sourceimage);
虽然这可能不是最有效的方法,但它会在内存中获得一个已知格式的图像,您只需要担心使用它的一种方法,而不是为不同的格式编码

现在,您有2个选项可用于访问图像信息: -像素属性(速度非常慢,但易于理解) -扫描线属性(速度快,但使用起来有点复杂)

这两种方法都允许您迭代图像中的所有像素并确定它们的颜色

现在你已经有了像素,你需要找出什么定义像素为“开”,什么定义像素为“关”。为此,我认为您必须选择一种颜色来表示“关闭”像素(例如白色-$FFFFFF),因此如果像素是该颜色,那么它将关闭,否则它将打开

如果你不太了解自己真正想要实现的目标,就很难再进一步了。您需要性能还是简单?您是否真的需要自己的结构,或者仅仅是位图数据(实际上是一个二维数组)就足够了


还有一个重要的提示。使用JPG文件是不好的。JPG使用近似的颜色,没有办法(我知道)保证在压缩/解压缩图像后加载什么颜色。虽然您的“关闭”像素可能是“接近白色”,但不能保证它们是“完全白色的”。

不管它的价值如何,您所描述的-打开/关闭图形-基本上是一个单色位图。你要做的就是创建一个遮罩,你所描述的是一个开/关图形,基本上是一个单色位图。你要做的就是做一个面具。谢谢。我同意你的建议。速度不是一个因素。选择BMP作为格式似乎是一条出路。我会根据你的答案来测试一下,看能不能让它正常工作。T