Java 将ImageIO.read用于扩展BuffereImage的类

Java 将ImageIO.read用于扩展BuffereImage的类,java,image,bufferedimage,extends,Java,Image,Bufferedimage,Extends,有什么人反对你好 我有一个扩展BuffereImage的类: 在此之前,我通过以下方式获得图像: Image image = ImageIO.read(res); 现在,我想将其转换为NamedImage,但以下尝试不起作用: NamedImage image = ImageIO.read(res); NamedImage image = (NamedImage) ImageIO.read(res); 我怎样才能实现我想做的事?为什么我不能将一个缓冲图像强制转换到一个扩展了这个自定义类的类中

有什么人反对你好

我有一个扩展BuffereImage的类:

在此之前,我通过以下方式获得图像:

Image image = ImageIO.read(res);
现在,我想将其转换为NamedImage,但以下尝试不起作用:

NamedImage image = ImageIO.read(res);
NamedImage image = (NamedImage) ImageIO.read(res);
我怎样才能实现我想做的事?为什么我不能将一个缓冲图像强制转换到一个扩展了这个自定义类的类中


人们反对什么?

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

您可以尝试使用如下解决方案:

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");

    }
}

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

您可以尝试使用如下解决方案:

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");

    }
}
我怎样才能实现我想做的事

NamedImage应该有一个接受BuffereImage和字符串的构造函数

或者,将图像添加到使用名称作为键的贴图中。例如

BufferedImage bi = //...
String name = //...
HashMap<String, BufferedImage> images = HashMap<String, BufferedImage>();
images.add(name, bi);
我怎样才能实现我想做的事

NamedImage应该有一个接受BuffereImage和字符串的构造函数

或者,将图像添加到使用名称作为键的贴图中。例如

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

如果您希望ImageIO使用您的特定子类,那么有一种可能性。但是,如果您只想给它起个名字,我可能会在地图上使用@andrewhompsons建议,因为它不太冗长

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);
}

如果您希望ImageIO使用您的特定子类,那么有一种可能性。但是,如果您只想给它起个名字,我可能会在地图上使用@andrewhompsons建议,因为它不太冗长

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);
}

通常不能将父类强制转换为子类。从ImageIO返回的图像是一个BuffereImage,它不知道您的新类。你能描述一下你想用这个新类做什么,以及如何使用它吗;我的目标是有一个类,我可以像普通的BuffereImage一样处理它,但我可以给它起个名字——例如image.setNamepic1;我需要在我的项目中按特定系统对图片进行排序,但这在这里并不重要。NamedImage应该有一个接受BuffereImage和字符串的构造函数。或者,将图像添加到使用名称作为键的映射中。通常不能将父类强制转换为子类。从ImageIO返回的图像是一个BuffereImage,它不知道您的新类。你能描述一下你想用这个新类做什么,以及如何使用它吗;我的目标是有一个类,我可以像普通的BuffereImage一样处理它,但我可以给它起个名字——例如image.setNamepic1;我需要在我的项目中按特定系统对图片进行排序,但这在这里并不重要。NamedImage应该有一个接受BuffereImage和字符串的构造函数。或者,将图像添加到使用名称作为键的地图中。这里只是一个警告。在这种情况下,构造函数将为新的BuffereImage分配数据,并使用两倍于所需内存量的内存从原始映像复制内容。小图像没有问题,但是。。。您可以通过使用superimg.getColorModel、img.getRaster、img.getColorModel.isAlphaPremultiplied、null来修复此问题,并且不调用setData。这里需要注意一点。在这种情况下,构造函数将为新的BuffereImage分配数据,并使用两倍于所需内存量的内存从原始映像复制内容。小图像没有问题,但是。。。您可以使用superimg.getColorModel、img.getRaster、img.getColorModel.isAlphaPremultiplied、null来修复此问题,并且不调用setData。好的,谢谢您。hashmap的问题是,我无法从图像中获取密钥,只能从密钥中获取图像。还是不?第二,我可能想添加更多信息,而不是名称。。。所以我需要一张桌子之类的东西。。。我认为一个名为SpecialImage的类更适合于此。对于双向地图,请看一看。好的,谢谢。hashmap的问题是,我无法从图像中获取密钥,只能从密钥中获取图像。还是不?第二,我可能想添加更多信息,而不是名称。。。所以我需要一张桌子之类的东西。。。我认为一个名为SpecialImage的类更适合于此。有关双向地图,请查看。