2

RI で、次のテスト コードを使用して、PNG 画像を含む生のベクターを作成します。(フォーマット = ARGB (640 x 480))

library(Cairo)
library(png)

Cairo(type='raster')
x=seq(0,3,by=0.01)    
y=2*sin(2*pi*(x-1/4))
plot(x,y)  #Test plot
rawdata = writePNG(dev.capture(native=TRUE), raw())
assign("rawpng", rawdata, envir = .GlobalEnv)

結果のベクトルは次のようになります。c(89, 50, 4e, 47, 0d, 0a, 1a, 0a, 00, 00, 00, 0d, 49, 48, 44, 52, 00, 00, 02, 80, 00, 00, 01, e0, 08, 06, 00, 00, 00, 35, d1, dc, e4, 00, 00, 20, 00, 49, 44, 41, 54, 78, 9c, ec, dd, 77, af, 5d, ee, cf, 75, 71, 41, d6, 90, 99, e7, ec, b3, 66, 9f, b5, d7, 7a, d6, b3, c0, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc, cc,.................................. b3, b0, fc, 1f, fe, 86, bd, ef, 71, 27, 9e, 88, 00, 00, 00, 00, 49, 45, 4e, 44, ae, 42, 60, 82)

生のベクターを使用してPythonキャンバスに画像を表示したいのですが、正しく表示できないようです。Rpy2 と Pil を使用して、何とか画像を生成できましたが、完全にめちゃくちゃです。

rawdataVec = rpy2.robjects.globalenv['rawpng']
rawdataArray = numpy.asarray(rawdataVec)
newshape = (640,480,4)
newstrides = (rawdataArray.itemsize, rawdataArray.itemsize,rawdataArray.itemsize)
data = numpy.lib.stride_tricks.as_strided(rawdataArray, shape=newshape, strides=newstrides)
img = Image.fromstring('RGBA', (640,480), data.tostring(),'raw','RGBA',0,1)
photo = ImageTk.PhotoImage(image=img)

プロットを画像ファイルとして保存し、Python で再ロードする方がはるかに簡単であることはわかっていますが、最初にファイルを保存せずにそれが必要です。それは可能ですか?

4

2 に答える 2

0

画像をStringIOバッファ (基本的にメモリ内の「ファイル」に画像を書き込む) に書き込んでから、そのバッファから読み込むことができますか?

于 2012-10-15T00:39:30.253 に答える
0

現在、デコーダーを使用してデコードしていますrawPNG代わりに試してください:

img = Image.fromstring('RGBA', (640, 480), data.tostring(), 'PNG')
于 2012-10-15T00:48:19.847 に答える