使用bufferImage从javafx2 2d颜色列表创建图像

时间:2017-11-30 15:04:25

标签: java java-8 javafx-2

我正在尝试将我的2d颜色列表转换为实际图像,然后将其导出,但是,当我尝试使用它时,它会扭曲颜色(显示错误颜色)

import javafx.scene.paint.Color;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.imageio.ImageIO;

public class ImageAction {
    public static void fromColorGrid(List<List<Color>> colorGrid) {
        int width = colorGrid.size();
        int height = colorGrid.get(0).size();

        BufferedImage buffImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        // Set each pixel of the BufferedImage to the color from the Color[][].
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                String colorStr = colorGrid.get(x).get(y).toString().replace("0x", "");
                int rgb = Integer.parseInt(colorStr, 16);
                System.out.println(colorStr + "   " + rgb);
                buffImage.setRGB(x, y, rgb);
            }
        }
        try {
            File outputfile = new File("saved.png");
            ImageIO.write(buffImage, "png", outputfile);
        } catch (IOException e) {
            System.out.println("Ups");
        }
    }
}

我哪里错了?

1 个答案:

答案 0 :(得分:0)

这一点对我来说似乎很奇怪:

String colorStr = colorGrid.get(x).get(y).toString().replace("0x", "");
int rgb = Integer.parseInt(colorStr, 16);
System.out.println(colorStr + "   " + rgb);
buffImage.setRGB(x, y, rgb);

该代码依赖于JavaFX颜色类which explicitly statestoString()方法:

  

此方法仅用于提供信息。返回字符串的内容和格式可能因实现而异。

相反,只需使用RGB值直接转换为AWT颜色:

Color fxColor = colorGrid.get(x).get(y);
java.awt.Color awtColor = new java.awt.Color((float) fxColor.getRed(),
        (float) fxColor.getGreen(),
        (float) fxColor.getBlue(),
        (float) fxColor.getOpacity());
buffImage.setRGB(x, y, awtColor.getRGB());

上面不依赖于任何特定的toString()实现,并且在我的快速测试中,代码似乎可以正常使用它。