我正在使用 Android 4.0 冰淇淋三明治在我的三星 Galaxy Tab 上开发一个项目。通过SL4A使用python我试图获取给定坐标(x,y)的jpeg(或png)图像的像素RGB值。
1 回答
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 绑定等那样完整、功能齐全或简单,而且它们可能会非常慢。(来自 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”的库只是意味着它们通过包装 C 库ctypes
而不是使用扩展模块,这在这种情况下不会直接提供帮助——但移植 libjpeg 之类的东西可能更容易或 FreeImage 比 PIL。(事实上,这可能只是“制作一个通用配方,运行构建脚本,然后推送,如果你幸运的话。)
作为一种真正疯狂的可能性,PySide早在 PIL 之前就被移植到了 Android,因此您始终可以使用 Qt 为您进行图像处理。但老实说,移植 PIL 或 imageio 或至少 libjpeg 必须更容易。