2

私はAndroid4.0アイスクリームサンドイッチを使用したSamsungGalaxyTabのプロジェクトに取り組んでいます。SL4Aを介してPythonを使用して、特定の座標(x、y)のjpeg(またはpng)画像のピクセルRGB値を取得しようとしています。

4

1 に答える 1

1

Androidスクリプトファサードには、これを実行できるものは何も含まれていません。そして、私が知る限り、PILimageio、またはその他の一般的な画像ライブラリをSL4Aに移植した人は誰もいません。

ただし、KivyのPythonforAndroidディストリビューションにはPILが付属しています。あなたがそれを使うことができれば、素晴らしい。そうでない場合は、彼らがどのよう_imaging.soに構築するかを見て、S4LA用に構築することができます。

これらのいずれかがうまくいく場合、これは簡単です。

jpg = PIL.Image.open('foo.jpg')
pixels = jpg.load()
r, g, b = pixels[x, y]

または、 TonyJpegDecoderNanoJPEGなどの純粋なPythonJPEGライブラリがいくつかあります。詳細については、PyPI、ActiveState、およびGoogleを検索してみてください。(GAEにはAndroidと同様の制限があるため、Google App Engineに関連するものを検索することをお勧めします。)

これらはいずれも、PIL、libjpegのPythonバインディングなどほど完全、フル機能、または単純ではなく、おそらく非常に遅くなります。(NanoJPEGのドキュメントから:「元のCコードの0.2秒と比較して、core2duoマシンで400x400ピクセルの画像を解凍するには12秒かかります」…)

しかし、あなたはあなたが必要なことをすることができるはずです。例(未テスト):

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のようなものを移植する方が簡単な場合があります。またはPILよりもFreeImage。(実際、運が良ければ、「一般的なレシピを作成し、ビルドスクリプトを実行して、プッシュするだけの問題かもしれません。)

本当にクレイジーな可能性として、PySideはPILよりずっと前にAndroidに移植されたので、いつでもQtを使用して画像操作を行うことができました。しかし正直なところ、PILまたはimageio、あるいは少なくともlibjpegを移植する方が簡単でなければなりません。

于 2013-01-07T06:43:54.000 に答える