我正在我的三星Galaxy Tab上做一个项目,Android 4.0冰淇淋三明治。通过SL4A使用python,我试图获得给定坐标(x,y)的jpeg(或png)图像的像素RGB值。
Android脚本facade不包含任何可以做到这一点的东西。而且,据我所知,还没有人将PIL、imageio或任何其他流行的图像库移植到SL4A。
然而,Kivy的Python for Android发行版附带了PIL。如果你能用这个,那太好了。如果没有,也许你可以看看他们是如何让_imaging.so
构建的,并为S4LA构建它。
如果这两种方法都适合你,这很简单:
jpg = PIL.Image.open('foo.jpg')
pixels = jpg.load()
r, g, b = pixels[x, y]
或者,有一些纯python JPEG库,如TonyJpegDecoder或NanoJPEG。尝试搜索PyPI、ActiveState和Google了解更多信息。(你可能想去Google App Engine搜索相关的东西,因为GAE有类似Android的限制。)
这些都不像PIL、libjpeg的Python绑定等那样完整、功能齐全或简单,而且它们可能会非常慢。(来自NanoJPEG的文档:"在我的core2duo机器上,它需要12秒来解压缩一个400x400像素的图像,而原始的C代码只需要0.2秒"…)
但是你应该能够做你需要做的。例如(未经测试):
with open('foo.jpg', 'rb') as f:
jpegdata = f.read()
decoder = TonyJpegDecoder.TonyJpegDecoder()
bmp = decoder.DecompressImage(jpegdata)
bmpstr = ''.join(map(cur(bmp)))
bmprgb = bgr2rgb(bmpstr)
pos = y * decoder.Width + x
rgb = map(ord, bmprgb[pos*3:(pos+1)*3])
请注意,许多声称是"纯Python"的库只是意味着他们通过ctypes
包装了一个C库,而不是使用扩展模块,这在这种情况下不会有直接的帮助,但移植libjpeg或FreeImage可能比移植PIL更容易。(事实上,这可能只是一个"制作一个通用配方,运行构建脚本,如果幸运的话,然后推送"的问题。)
作为一个真正疯狂的可能性,PySide移植到Android早在PIL之前,所以你总是可以使用Qt为你做图像操作。但老实说,移植PIL或imageio或至少libjpeg要容易得多。