2011-02-04 114 views
0

给定图片(格式是问题的一部分)我希望能够将其转换为我的“格式”。我的格式就是说,只是一个简单的X by Y布尔数组,覆盖时间图像的大小,说明特定像素是否“开启”。颜色无关紧要。我不知道图像格式(如BMP,JPG,GIF),因此只要读取图像然后“映射”该像素状态即可。将“图片”/“图片”格式转换为我自己的

我猜测难度可能是确定图像中是否有特定的像素处于“开”状态。由于这是我创建的程序的特定部分的一部分,因此我可以确保用户仅以单一颜色和特定范围创建图像。例如通常的红色,绿色,黄色等

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

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

例如:image created是20,10,并且用户从点0,0 - > 6,0(即7个像素宽)绘制了一条直线。他们已经将它保存为BMP,JPG。然后,我想打开该图像,并对其进行扫描以确定是否绘制了特定的像素。所以像素0,0 1,0 2,0 3,0 4,0 5,0 6,0将“开”,其他所有像素将关闭。如果我不得不迫使他们将它保存为特定类型,我对此感到高兴。

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

感谢

杰森

+0

对于它的价值,你所描述的 - 开/关图形 - 基本上是一个单色的位图。你所要做的就是创建一个面具。 – GrandmasterB 2011-02-04 07:28:55

回答

3

出可以加载一些不同的图像格式用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种选择: - 像素房产(这是很慢,但很容易理解) - Scanlines的属性(这是快,但有点复杂使用)

两者都将允许您迭代图像中的所有像素并确定其颜色。

现在你已经有了像素,你需要弄清楚像素是什么定义为“ON”,什么定义像素为“OFF”。为此,我认为你将不得不选择一种颜色来表示一个“OFF”像素(例如白色 - $ FFFFFF),所以如果一个像素是那种颜色,那么它是关闭的,否则它是开启的。

如果不知道你真的想达到什么目标,那么有点难以进一步了解。你需要表现还是简单?你真的需要你自己的结构,或者只是位图数据(实际上是一个二维数组),就足够好了。

而且一个重要的说明。使用JPG文件并不好。 JPG使用近似的颜色,没有办法(我知道),你可以保证图像压缩/解压缩后将加载什么颜色。虽然你的“OFF”像素可能是“接近白色”,但不能保证它们会“完全白色”。

+0

谢谢。我会按照你的建议去做。速度不是一个因素。选择BMP作为格式似乎是要走的路。我会对它进行测试,看看我能否根据你的答案使其工作。他们只会创建一种颜色的原始BMP,所以我可以假设除此之外的任何颜色都会关闭 - 一旦我确定自己如何知道他们选择了哪种颜色:) - 可能是我现在遇到的第一种颜色。谢谢。我会将其标记为已回答。 – Jason 2011-02-04 10:03:31