我想创建一个新类,因为我想创建一些新方法,该方法扩展了BufferedImage并接受一个文件(一个bmp图片)作为参数。
就像这里发生的事情:
BufferedImage image = ImageIO.read(new File(dir +"coffeecup.png"));
浏览文档时,我发现BufferedImage类具有两个构造函数:
公共BufferedImage(ColorModel cm,WritableRaster栅格,
boolean isRasterPremultiplied,
哈希表属性)
public BufferedImage(int width,
整数高度
int imageType)
浏览所有参数的文档时,我没有注意到哪个参数引用了文件(如果有)。
那么,如何创建一个新的BufferedImage类却以文件作为参数之一呢?
为什么不能只使用BufferedImage image = ImageIO.read(new File(dir +"coffeecup.bmp")); ???
因为我想创建一些其他方法。
好吧...什么样的方法,为什么? 什么阻止了你? 就目前而言,很难猜测您真正想要的是什么,或者甚至是否可能要做。 BufferedImage类没有任何从文件读取的方法...
不要尝试复杂的事情。 除非您尝试覆盖某些实现(我建议您这样做),否则请遵循基本规则构成而非继承。 只需创建一个包装器类,而不是尝试非常规地扩展BufferedImage即可。 您正在尝试合并各种担忧,这是一个可怕的想法。 不能使用文件构造BufferedImage,因为这与Image无关。 如关于BufferedImage所述
It manages the image in memory and provides methods for storing, interpreting, and obtaining pixel data.
这就是它应该关心的。 因此,创建一个包装器类,您可以添加方法以执行任何操作
public class BufferedImageWrapper {
private BufferedImage bufferredImage;
public BufferedImageWrapper(File file) {
try {
bufferedImage = ImageIO.read(file);
} catch (IOException ex) {
ex.printStackTrace();
}
}
// your methods here
}
我可能应该声明我完全同意@peeskillet,并且不建议使用下面的建议。 :-)
但是,如果您真的想扩展BufferedImage,则可以执行以下操作(受我以前的EasyImage类的启发,该类位于沙箱中是有原因的...):
public class EasyImage extends BufferedImage {
public EasyImage(File iput) throws IOException {
this(ImageIO.read(input));
}
public EasyImage(BufferedImage image) {
this(image.getColorModel(), image.getRaster());
}
private EasyImage(ColorModel cm, WritableRaster raster) {
super(cm, raster, cm.isAlphaPremultiplied(), null);
}
public boolean write(String format, File output) throws IOException {
return ImageIO.write(this, format, output);
}
}
病态的peeskillets回答并使用了他的想法,但是也请您给予答复,它也非常有用。 :)