Rを使用して、データのマトリックスからラスターイメージを作成しようとしています。ただし、画像の端に奇妙なアーティファクトが発生しています。
私が使用しているコードは次のとおりです。
# From the example for rasterImage(). A 3 pixel by 5 pixel b/w checkerboard.
testImage <- as.raster(0:1, nrow=3, ncol=5)
testImage
[,1] [,2] [,3] [,4] [,5]
[1,] "#000000" "#FFFFFF" "#000000" "#FFFFFF" "#000000"
[2,] "#FFFFFF" "#000000" "#FFFFFF" "#000000" "#FFFFFF"
[3,] "#000000" "#FFFFFF" "#000000" "#FFFFFF" "#000000"
png('test.png', width=5, height=3, units='px')
# Just want the image, no margins, boarders or other fancy stuff.
par(mar = c(0,0,0,0) )
plot.new()
plotArea = par('fig')
rasterImage(testImage, plotArea[1], plotArea[3],
plotArea[2], plotArea[4], interpolate = FALSE )
dev.off()
これはOSXのR2.12.0で実行されましたが、R2.11.0から同じ出力が得られます。
私が得ている出力は次のとおりです(5x3から150x90にスケーリング)
コーナーのピクセルは黒である必要があります。これは、何らかの補間が行われていることを示しています。
私が期待している出力は次のとおりです。
私のコードがマトリックスからラスター画像を忠実に生成できない理由について何か提案はありますか?
使用目的
これは私が取り組んでいるパッケージ用なので、追加の依存関係を導入しないように、可能であればRベースパッケージ内にとどまりたいと思います。パッケージはグラフィックスデバイスを実装しているので、渡された情報から経営幹部レベルのソリューションを取得しGERaster()
、src/main/engine.c
Rライブラリのみを使用してPNGを作成する場合は、そのショットも提供します。
OSXのソリューション
nicoが指摘しているように、誤った動作はアンチエイリアスの結果です。png()
Cairoグラフィックなど、アンチエイリアスを無効にできる出力メソッドを使用するように指示された場合、プロットは期待どおりに動作します。
png('test.png', width=5, height=3, units='px', type='cairo', antialias=NULL)
OS Xでは、のデフォルトのバックエンドpng()
はQuartzですが、png(..., type='quartz')
現在、によって設定されたディレクティブは無視されquartz.options()
ます。quartz()
デバイスを使用せずに直接呼び出すことでデバイスを起動すると、OSXでネイティブに忠実な出力を生成できますpng()
。
quartz(file='test.png', type='png', width=5, height=3, dpi=1, antialias=FALSE)
Windowsの考え方は異なります
次の出力がWindowsで生成されます。
R-helpメーリングリストのPaulMurrell(Rグラフィックスデバイスの慈悲深い独裁者)による回答によると、次のようになります。
これは丸め(切り捨て)の問題です。修正に取り組んでいます。
ラスターイメージに含まれるピクセル数が非常に少ない場合を除いて、Windowsでのこの動作は目立たないはずです。