2012-02-03 10 views
4

私のeclipse-rcpアプリケーションでは、30000x10000 px以上のサイズの画像を作成する必要があります。この画像はNatTableの表現です。 OutOfMemory、SWTError - IllegalArgumentまたはPCが応答を停止する(btw、ウィンドウ7、64ビット、4 RAMクライアントのラップトップは非常に遅いが、まだ画像を作成する必要がある) 。コードスニペットは次のとおりです。大きなSWTイメージを作成する方法は?

private Image getNattableImageRepresentation(final Display display) { 
     final Rectangle totalGridArea = getTotalGridArea(); //this returns Rectangle(0,0,30000,10000) 
     setGridLayerSize(totalGridArea); 
     final Image nattableImage = new Image(display, totalGridArea); 
     final GC nattableGC = new GC(nattableImage); 
     gridLayer.getLayerPainter().paintLayer(gridLayer, nattableGC, 0, 0, totalGridArea, configRegistry);//nattable API, which draws an image into a specified gc 
     restoreGridLayerState(); 
     return nattableImage; 
    } 
    return null; 
} 

このような巨大な画像を作成するトリックやAPIはありますか? Java Advanced Imaging Apiはこの目的に適していますか?

ご迷惑をおかけして申し訳ございません。

+0

テーブルを画像ファイルに保存したいですか? – Sorceror

+0

この記事は、私がいくつかの画像問題 - [SWT image resources](http://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html)を見ているときに私を助けました – Sorceror

+0

ありがとう記事、私は間違いなくそれを見てみましょう。いいえ、テーブルにファイルを保存する必要はありません。実際には、PaperClips ImagePrintを使用してNatTableを印刷するには、ImageDataオブジェクトを取得する必要があります。基本的に、私はテーブルを印刷する必要があります。 –

答えて

1

ImageMagickは、このような画像処理のためにきちんとしたツールです。..新しいCGは間違いなく、道ではありませんあなたは大きなものにすべての予備画像を参加します場合は...、全く問題はないはず。..

+1

作曲は期待どおりに動作していますが、かなりのメモリを消費するようです。私はImageMagickのim4javaインターフェイスを試しましたが、それは理由であってはなりません。また、合成されたイメージがアプリケーションにロードされると、Javaはそれを処理できません。イメージはわずか10Mb(15000x400)ですが、SWTエラーで失敗します。これは悲しいことです。 –

+1

これは確かに10MBだけではありませんが、圧縮されていますが、32ビットあたり15000x400 = 6Mピクセルですが、特にSWTがプラットフォームに依存するハンドルを使用すると、各画像に大きなオーバーヘッドが生じます。とにかく悲しいです。 – Sorceror

1

BigBufferedImageを使用できます。ハードドライブに画像を保存するのは本当のメリットです。ヒープサイズや物理メモリの制限については心配する必要はありません。最大2,147,483,647ピクセル(または46,340 x 46,340ピクセル)を格納できます。

空BigBufferedImage作成:BigBufferedImageに存在しない画像をロード

BigBufferedImage image = BigBufferedImage.create(
      tempDir, width, height, type); 

を:

BigBufferedImage image = BigBufferedImage.create(
      imagePath, tempDir, type); 

画像の一部をレンダリング:

part = image.getSubimage(x, y, width, height); 

大きな画像処理の詳細についてはread this articleを参照してください。

+0

ありがとうございます。私はそれが非常に良いアプローチだと思います。しかし残念ながら、私はもうプロジェクトには入っていないので、残念ながらそれを検証することはできません。他の誰かができるかもしれない。 –

関連する問題