2010-11-23 11 views
3

イメージの幅、高さ、深さ、およびバイト配列を指定すると、SWT Imageオブジェクトを作成する必要があります。現在、私は8ビットイメージのデータを与えられても問題はありません。バイト配列から16または32ビットイメージを作成する

int imageWidth; 
int imageHeight; 
int depth; 
byte[] imageBytes; 
//calculate the values 

imageData = new ImageData(imageWidth, imageHeight, depth, new PaletteData(255,255,255), 1, imageBytes); 
new Image(display, imageData); 

問題は16ビットイメージでは色が少しずれていることです。黒のピクセルは実際にはグレーでなければなりません。

32ビットイメージの場合、黒いピクセルがわずかに表示され、残りのイメージは白です。

アイデア?

ありがとうございます。

編集:imageBytes配列は、私が仕様書を入手できなかった独自のグラフィックスファイルから読み込まれます(したがって、フォーマットは完全にわかりません)。

私は32ビットイメージでいくつかの進歩を遂げることができました。 32ビットイメージがRGBAX形式の1つであるように見えます。私はそれを24ビットイメージに変換しましたが、今は16ビットイメージと同じ問題があります(グレーは黒でなければなりません)。

imageBytes配列のサイズは、奥行きがビット単位の(width * height *(depth/8))です。

各ピクセルのバイト順序を変更しようとしましたが、問題は解決しませんでした。真っ黒でなければならない区域では、黒、白と黒の混合物、またはすべて白である。

+0

あなたの問題を解決する鍵は、あなたが扱っている独自のフォーマットを理解することです。書式を完全に理解していない限り、16ビットまたは32ビットのイメージを読み込むときに 'imageBytes'を正しく設定していない可能性があります。つまり、投稿したコードが実行される前に問題が発生している可能性があります。画像を共有している場合は、それを読むために使用しているコード全体と、取得した結果のスクリーンショットを見ると、画像フォーマットを理解する助けを得ることができます。その情報がなければ、私や他の誰かができることはそれほど多くありません。 – misha

答えて

0

あなたが記述した症状から、エンディアンの問題が発生している可能性があります。 Javaのbyteデータ型はなので、16ビットイメージを構築するときは、合計2つのJava Java bytesが、構築されたイメージの1つのピクセルを構成します。明らかに、32ビットイメージの場合、ピクセルあたりのJava bytesの数は4になります。

たとえば、ビッグエンディアンの32ビットの世界では、[0 0 0 255]はかなり暗いグレー(本質的に黒色)になります。一方、リトルエンディアンの世界では、白にかなり近いでしょう。

いくつかの質問:

  • どのようにあなたのimageBytes配列を移入していますか?
  • サイズは何ですか? depthがビットであれば、width*height*depth/8と仮定する。あなたが試みることができる

いくつかの点:

  • ImageDataコンストラクタは
  • 期待していることエンディアンを見つけるためにSWTのドキュメントを読んで、あなたのimageBytes配列内の単一画素内bytesをシャッフルします。たとえば、32ビットの場合、[0 0 0 255][255 0 0 0 ]になります。
+0

あなたの質問に答えるために質問を更新しました。 – juan2raid

0

未知のグラフィックスフォーマットで作業していて、(b)灰色の問題がある場合、高ビットは色ではなく他の機能(おそらく透明度/アルファ) 。これにより、すべての黒い画像が予想どおりに50%灰色になることが容易になる。

各画像バイト(または16ビットなど)で単純なビット演算を試して、上位ビットをゼロに設定してください。シングルバイトの場合

、すなわち: finalByte = originalByte & 0x7f;

それは、このビットはランレングス符号化(RLE)、または他のvarintエンコーディングのためのマーカーであることも可能ですが、あなたは正しい画像サイズを取得している場合/これはおそらくそうではありません。

関連する問題