如何使用文件作为参数创建新的BufferedImage类

时间:2014-07-02 11:09:53

标签: java constructor bufferedimage

我想创建一个新类,因为我想创建一些新方法,它扩展了BufferedImage并将文件(bmp图片)作为参数。 就像这里发生的一样:

BufferedImage image = ImageIO.read(new File(dir + "coffeecup.png"));

查看文档,我发现BufferedImage类有两个构造函数:

  1. public BufferedImage(ColorModel cm,WritableRaster raster,          boolean isRasterPremultiplied,          Hashtable属性)
  2. public BufferedImage(int width,          int高度,          int imageType)
  3. 通过所有参数的文档,我没有注意到哪个参数引用了一个文件,如果有的话。 那么我需要如何创建一个新的BufferedImage类,但是将文件作为参数之一呢?

2 个答案:

答案 0 :(得分:3)

不要尝试复杂的事情。除非你试图覆盖一些实现(我建议反对)遵循基本规则组合而不是继承。只需创建一个包装类,而不是试图不经意地扩展BufferedImage。你正试图结合一些可怕的想法。无法使用文件构造BufferedImage,因为这不是Image的关注点。正如关于BufferedImage所述

  

它管理内存中的图像,并提供存储,解释和获取像素数据的方法。

这就是它应该关注的全部内容。因此,创建一个包装类,您可以添加方法来执行任何操作

public class BufferedImageWrapper {
    private BufferedImage bufferredImage;

    public BufferedImageWrapper(File file) {
        try {
            bufferedImage = ImageIO.read(file);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    // your methods here
}

答案 1 :(得分:2)

我应该说我完全赞同@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);
    }
}