(人们反对你好吗?)
我有一个扩展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);
我如何实现我想做的事情?为什么我不能将缓冲的图像转换为扩展此自定义类的类?
(人们反对谢谢你?)
答案 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
应该有一个接受BufferedImage
和String
的构造函数。
或者,将图像添加到使用名称作为键的地图中。 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);
}