2011-03-31 185 views
2

有没有人知道一种方式从PythonMagick.Image实例获取像素数据,而不必先写入磁盘?从PythonMagick图像获取像素数据?

举例来说,我可以使用图像中读出:

import PythonMagick 
im = PythonMagick.Image('image.jp2') 

我现在想能够得到的未压缩的图像数据,这样我可以在别的像NumPy这样或matplotlib使用它,但我似乎无法找到任何方法来做到这一点。我只是直接使用matplotlib或PIL,但我正在阅读的图像格式是JPEG 2000,据我所知,它只支持PythonMagick。

有什么建议吗?

回答

3

免责声明:我没有PythonMagick建在哪里,我现在和不是专家,所以(1)任何或所有以下的可能是错误的,(2),它肯定会不到你具体(3)如果别人知道的更好,我希望他们不会因为在这里看到答案而被推迟。无论如何:

从快速查看代码看来,您可以使用Image类中的​​方法逐个读取像素值。这会返回一个PythonMagick.Color值,您可以从中提取R,G,B组件。底层的C++库支持使用Image::writePixels一次读出大量像素,这也存在于PythonMagick.Image;但我认为该方法的正确使用取决于PythonMagick中未实现的其他内容。这太遗憾了,因为我敢打赌,它一次读取一个像素会更有效率。

或者也许更好,它看起来好像你可以将图像的内容写入内存中的PythonMagick.Blob对象,基本上与仅写入文件而不写入文件:-)相同。您可以选择应该写入的格式,就像写入文件时一样。似乎有一种叫get_blob_data的提取Blob内容的东西。事情是这样的:

im = PythonMagick.Image('image.jp2') 
blob = PythonMagick.Blob() 
im.write(blob, "png") 
data = PythonMagick.get_blob_data(blob) 

产生的data是,我认为,一个Python字符串,它的字节是图像的二进制表示。 (我假设你使用的是Python 2.x,其中字符串类型是8位,我不知道PythonMagick是否可以用于3.x.)我认为有一些格式基本上是原始像素数据;尝试“RGB”。然后你可以通过很多struct.unpack或其他方法提取内容。

+0

感谢您的建议,Gareth。你觉得哪个版本的PythonMagick具有get_blob_data方法?我现在从Ubuntu库中使用0.9.1版本,我似乎没有。我想最终我可能最终不得不使用像素迭代器,因为numpy希望它的输入已经以数组形式(http://dmr.ath.cx/gfx/python/)。 – 2011-04-03 11:47:50

+0

我想我正在从ImageMagick网站的最新版本中查看源代码。我完全有可能以某种方式误解它 - 正如我所说的,我不是PythonMagick专家。 – 2011-04-03 16:38:43

+0

This works:open(“foo.png”,“wb”)。write(blob.data) 不需要调用get_blob_data().... – 2014-12-16 16:46:11