无法实例化ColorModel类型

时间:2015-02-27 16:54:14

标签: java awt bufferedimage

请不要不喜欢这个"泛型问题",因为这确实是一个问题。我还搜索了其他问题,问题始终是人们想要实例化接口。那不是我的情况。

类ColorModel不是一个接口,并且有一个带int的构造函数。为什么我得到一个"无法实例化类型ColorModel" -Error?

以下是代码:

package test;

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class BufferedImageGetRGB {

    public static void main(String...args) {

        BufferedImage img = null;
        try {
            img = ImageIO.read(new File("C:\\Users\\xxxxx\\Desktop\\testbinary.png"));
        } catch (IOException e) {}

        for (int y=0; y<img.getHeight(); ++y) {
            for (int x=0; x<img.getWidth(); ++x) {
                System.out.println(img.getRGB(y, x));
                ColorModel cm = new ColorModel(img.getRGB(y, x));
            }
        }
    }
}

1 个答案:

答案 0 :(得分:4)

您无法直接实例化ColorModel类型的对象,因为此类型为抽象,因为ColorModel API会告诉您,并且与接口相同,抽象类型不能直接构造。 API还会告诉您可能的具体子类型。这里的教训是,您的问题与界面类型问题非常相似,解决方案类似 - 始终在您遇到此类问题时检查API。

请注意,您可以通过调用ColorModel方法直接从BufferedImage获取图片getColorModel()。不确定为什么你要在for循环中重复创建一个新的。

即,

BufferedImage img = null;
try {
    img = ImageIO.read(new File("C:\\Users\\xxxxx\\Desktop\\testbinary.png"));
} catch (IOException e) {
   e.printStackTrace(); // never leave this block empty ********** 
   // exit program here?
}

ColorModel cm = img.getColorModel();

for (int y=0; y<img.getHeight(); ++y) {
    for (int x=0; x<img.getWidth(); ++x) {
        System.out.println(img.getRGB(y, x));
        // ColorModel cm = new ColorModel(img.getRGB(y, x));
    }
}

在旁注中,catch (IOException e) {}不是一种安全的做法,希望您的真实代码不会这样做。