我正在使用 Android 4.0 Ice Cream Sandwich 在我的 Samsung Galaxy Tab 上开发一个项目。 通过 SL4A 使用 python 我试图获取给定坐标(x,y)的 jpeg(或 png)图像的像素 RGB 值。
请您参考如下方法:
Android 脚本外观不包含任何可以执行此操作的内容。而且,据我所知,没有人做过 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 绑定(bind)等那样完整、功能齐全或简单,而且它们可能会非常慢。 (来自 NanoJPEG 的文档:“在我的 core2duo 机器上解压缩 400x400 像素图像需要 12 秒,而原始 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早在 PIL 之前就已移植到 Android,因此您始终可以使用 Qt 为您进行图像处理。但老实说,它必须更容易移植 PIL 或 imageio 或至少 libjpeg。
