2013-01-07 23 views
2

我正在使用Android 4.0冰淇淋三明治在我的Samsung Galaxy Tab上進行項目工作。 通過SL4A使用python我想獲得給定座標(x,y)的jpeg(或png)圖像的像素RGB值。使用Python獲取jpeg的像素值(SL4A android 4.0)

+1

你是否必須使用SL4A而不是其他的Python端口?Kivy的[Python for Android](http://txzone.net/2012/01/introducing-python-for-android/)附帶了PIL,這將使這更容易。 – abarnert

回答

1

Android腳本外觀不包括任何可以做到這一點的東西。而且,據我所知,沒有人向SL4A做過端口PIL,imageio或任何其他流行的圖像庫。

但是,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那裏,如TonyJpegDecoderNanoJPEG屈指可數。嘗試搜索PyPI,ActiveState和Google以獲取更多信息。 (您可能想要搜索與Google App Engine相關的內容,因爲GAE對Android有類似的限制。)

這些都不像PIL,用於libjpeg的Python綁定一樣完整,功能全面或簡單,等等。,他們可能會很慢。 (從NanoJPEG的文檔:「它需要12秒來解壓我的core2duo機器上的一個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」僅僅意味着他們正在通過​​包裹C庫,而不是使用的擴展模塊,這將沒有直接的幫助在這種情況下 - 但它可能比PIL更容易移植像libjpeg或FreeImage之類的東西。 (事實上​​,它可能只是「做一個普通的配方問題,運行構建腳本,推,如果你是幸運的。)

作爲一個真正瘋狂的可能性,PySide被移植PIL之前長期的Android ,所以你總是可以使用Qt爲你做圖像處理,但說實話,它必須更容易移植PIL或imageio或至少libjpeg。