2017-02-11 22 views
0

私はPhotoshopで作成したグレースケールheight mapを持っており、処理のためにJavaプログラムに渡す必要があります。私はこのコードをグレースケールに変換し、次いでImageIO.read(...)方法を使用して、それをロードしています:
Java BufferedImage Rasterの不正確なグレースケール値

Photoshopで
BufferedImage map = ImageIO.read(new File(...)); 
BufferedImage heightMap = new BufferedImage(map.getWidth(), map.getHeight(), BufferedImage.TYPE_BYTE_GRAY); 
heightMap.getGraphics().drawImage(map, 0, 0, null); 
heightMap.getGraphics().dispose(); 

、画素(0,0)は17の値を有します私はmap.getRGB(0, 0)>>16&0xFFを実行したとき。私はheightMap.getData().getSample(0, 0, 0)または((byte[])(heightMap.getRaster().getDataElements(0, 0, null)))[0] & 0xffを使用する場合、私は興味深いことに64

の値を取得し、また、私はこれを修正し、17の値を取得するにはどうすればよい64

の値を取得しますか?

ありがとうございました。

+0

なぜグレースケールイメージをグレースケールイメージに変換していますか? getTypeとgetColorModelは元のマップで何を表していますか? – john16384

+0

イメージ(PNG)をロードしているときに、タイプ0(TYPE_CUSTOM)とColorModelでロードされています:#pixelBits = 32 numComponents = 2 color space = [email protected] transparency = 3 has alpha = true isAlphaPre = falseです。 –

答えて

0

この問題の原因はファイル形式(PNG)でした。 Photoshopでは、キャンバスモードをグレースケールと8ビット/チャンネルに設定しました。完了後、画像/高さマップをPNG形式で保存していたため、Javaに画像がまたはTYPE_CUSTOMとしてロードされ、グレースケール変換が不透明になっていた可能性があります。 JPEGの画像を保存する

は、Javaは、グレースケール(TYPE_BYTE_GRAY)に直接画像をロードし、両方map.getData().getSample(0, 0, 0)((byte[])(map.getRaster().getDataElements(0, 0, null)))[0] & 0xffは13ない完璧な値の値を返しますが、64

PSよりもずっといい作ら:予想通り、今度はmap.getRGB(0, 0)>>16&0xFFが64の間違った値を返しました。