2017-11-30 11 views
0

画像を変更するプログラムを作成しました。BufferedImageに描画すると間違った色が表示されることがあります。

まず、私は、画像を取得し、次のようにその描画コンテキストを取得:

BufferedImage image; 
try { 
    image = ImageIO.read(inputFile); 
} catch (IOException ioe) { /* exception handling ... */ } 

Graphics g = image.createGraphics(); 

そして私はこのように画像を変更します。

for (int x = 0; x < image.getWidth(); x++) { 
    for (int y = 0; y < image.getHeight(); y++) { 
     g.setColor(/* calculate color ... */); 
     g.fillRect(x, y, 1, 1); 
    } 
} 

私は画像の変更が完了した後私は次のように画像を保存します:

try { 
    ImageIO.write(image, "PNG", save.getSelectedFile()); 
} catch (IOException ioe) { /* exception handling ... */ } 

ほとんどの場合、これは大丈夫です。私はこの

enter image description here

にこのテクスチャ

enter image description here

をrecoloringしようとしたとき

しかし、私はこの代わりに取得する:

enter image description here

しかし、デバッガの内部では、Graphicsの色はピンクの色合いです。

コメントは、ユーザーが開いた画像に色の制限がある可能性があります。私が読んでいる画像と同じ画像に描画しているので、私のプログラムはこれらの制限に従わなければなりません。サンプル画像はかなりグレースケールのようですが、明らかにビット深度は8ビットです。それで、画像が8ビットのままでなければならないので、私が描いているピンクはグレースケールに変換されるでしょうか?

+1

これを再現することができるセットアップ(つまり、[MCVE]と画像の例)を提供する機会はありますか? – Marco13

+2

色のモデルが使用している色をサポートしていない可能性があります – MadProgrammer

+0

@ Marco13私の質問に例を追加しました。 – JoFelix

答えて

0

コメントに示唆されているように、ここでの主な問題は間違ったカラーモデルです。あなたは、元の画像をロードし、そして...それについて

BufferedImage image = ImageIO.read(
    new URL("https://i.stack.imgur.com/pSUFR.png")); 
System.out.println(image); 

をいくつかの情報を印刷するとき、それは

[email protected]: type = 13 IndexColorModel: #pixelBits = 8 numComponents = 3 color space = [email protected] transparency = 1 transIndex = -1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 128 height = 128 #numDataElements 1 dataOff[0] = 0 

IndexColorModelは、必ずしもすべての色が、それらのサブセットのみをサポートしていないと言うだろう。 (基本的に、画像は「必要な」色だけをサポートし、よりコンパクトな格納を可能にします)。

解決策は、画像を適切なカラーモデルを持つ画像に変換することです。

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.URL; 

import javax.imageio.ImageIO; 

public class ImageColors 
{ 
    public static void main(String[] args) throws IOException 
    { 
     BufferedImage image = ImageIO.read(
      new URL("https://i.stack.imgur.com/pSUFR.png")); 

     // This will show that the image has an IndexColorModel. 
     // This does not necessarily support all colors. 
     System.out.println(image); 

     // Convert the image to a generic ARGB image 
     image = convertToARGB(image); 

     // Now, the image has a DirectColorModel, supporting all colors 
     System.out.println(image); 

     Graphics2D g = image.createGraphics(); 
     g.setColor(Color.PINK); 
     g.fillRect(50, 50, 50, 50); 
     g.dispose(); 

     ImageIO.write(image, "PNG", new File("RightColors.png")); 
    } 

    public static BufferedImage convertToARGB(BufferedImage image) 
    { 
     BufferedImage newImage = new BufferedImage(
      image.getWidth(), image.getHeight(), 
      BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g = newImage.createGraphics(); 
     g.drawImage(image, 0, 0, null); 
     g.dispose(); 
     return newImage; 
    }  
} 
関連する問題