1

(人们有什么反对你好?)

我有一个扩展类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);

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

(人们反对谢谢你?)

4

3 回答 3

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

    }
}
于 2013-08-10T14:58:34.607 回答
2

我怎样才能实现我想做的事情?

NamedImage应该有一个接受 aBufferedImage和 a的构造函数String

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

BufferedImage bi = //...
String name = //...
HashMap<String, BufferedImage> images = HashMap<String, BufferedImage>();
images.add(name, bi);
于 2013-08-10T15:00:56.253 回答
2

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

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);
}
于 2013-08-12T08:39:03.417 回答