将ImageIO.read用于扩展BufferedImage的类

时间:2013-08-10 14:37:04

标签: java image bufferedimage extends

(人们反对你好吗?)

我有一个扩展BufferedImage的课程:

public class NamedImage extends BufferedImage{
    String name;
    public NamedImage(int width, int height, int imageType) {
        super(width, height, imageType);
    }
    public void setName(String text){
        name = text;
    }
}

在我有这个之前,我得到了我的图像:

Image image = ImageIO.read(res);

现在,我想将其翻译为NamedImage,但以下尝试不起作用:

NamedImage image = ImageIO.read(res);
NamedImage image = (NamedImage) ImageIO.read(res);

我如何实现我想做的事情?为什么我不能将缓冲的图像转换为扩展此自定义类的类?

(人们反对谢谢你?)

3 个答案:

答案 0 :(得分:4)

您可以将子类的实例强制转换为其父类。 但是你不能将超类的实例强制转换为子类

你可以尝试使用这样的解决方案:

public class NamedImage extends BufferedImage {

    private String name;

    public NamedImage(BufferedImage img,String name){
        super(img.getWidth(),img.getHeight(),img.getType());
        setData(img.getData());
        this.name=name;
    }


    public NamedImage(int width, int height, int imageType) {
        super(width, height, imageType);

    }

    public void setName(String text) {
        name = text;
    }

    public static void main(String args[]) throws IOException {
        NamedImage image = new NamedImage(ImageIO.read(new File("/Users/igor/Downloads/cats-coloring.gif")),"A cat");

    }
}

答案 1 :(得分:2)

  

我怎样才能达到我想做的目的?

NamedImage应该有一个接受BufferedImageString的构造函数。

或者,将图像添加到使用名称作为键的地图中。 E.G。

BufferedImage bi = //...
String name = //...
HashMap<String, BufferedImage> images = HashMap<String, BufferedImage>();
images.add(name, bi);

答案 2 :(得分:2)

如果您希望ImageIO使用您的特定子类,这是一种可能性。但是,如果您只想给它命名,我可能会使用Map<String, BufferedImage>的@AndrewThompsons建议,因为它不那么详细。

ImageInputStream stream = ImageIO.createImageInputStream(res);
Iterator<ImageReader> readers = ImageIO.getImageReaders(stream);

if (readers.hasNext()) {
    ImageReader reader = readers.next();
    reader.setInput(reader);

    int w = reader.getWidth(0);
    int h = reader.getHeight(0);

    ImageReadParam param = reader.getDefaultReadParam();

    NamedImage image = new NamedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    param.setDestination(image);

    /*image = (NamedImage)*/ reader.read(0, param);
}