【问题标题】:Efficient way to crop a strip of a BufferedImage裁剪一条 BufferedImage 的有效方法
【发布时间】:2012-05-07 17:04:13
【问题描述】:

我想通过将图像的顶部移动到底部来删除图像的一条(横向)。目前我正在这样做,但我认为也许有一种更有效的方法可以在不创建新的 BufferedImage 的情况下实现这一目标。

片段代码:

BufferedImage myImage = ...;
...
BufferedImage imgPart_1 = myImage.getSubimage(0, 0, myImage.getWidth(), (myImage.getHeight()/2)-50);
BufferedImage imgPart_2 = myImage.getSubimage(0, myImage.getHeight()/2, myImage.getWidth(), myImage.getHeight()/2);
BufferedImage newImage = new BufferedImage(myImage.getWidth(), myImage.getHeight(), BufferedImage.TYPE_INT_ARGB);

Graphics g = newImage.createGraphics();
g.drawImage(imgPart_1, 0, 0, null);
g.drawImage(imgPart_2, 0, imgPart_1.getHeight(), null);

myImage = newImage;
...

提前致谢。

【问题讨论】:

    标签: java bufferedimage java-2d


    【解决方案1】:

    您必须创建一个新图像,但您不必自己绘制它。

    您可以使用CropImageFilter 获取您的图片。

        Toolkit toolkit = Toolkit.getDefaultToolkit();
        CropImageFilter cropFilter = new CropImageFilter
                (x, y, imageWidth, imageHeight);
        Image croppedImage = toolkit.createImage(new FilteredImageSource
                (image.getSource(), cropFilter));
    

    【讨论】:

      【解决方案2】:

      在我看来效率很高:你确定这里存在性能问题吗?

      如果你真的想避免创建一个新的缓冲图像,你可以使用 myImage 作为目标,即这样做:

      Graphics g = myImage.createGraphics();
      g.drawImage(imgPart_1, 0, 0, null);
      g.drawImage(imgPart_2, 0, imgPart_1.getHeight(), null);
      

      我认为这在您的情况下可以正常工作,尽管您需要进行测试(当源和目标区域重叠时可能会出现一些奇怪的效果!)

      【讨论】:

        猜你喜欢
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多