【问题标题】:Crop/trim a JPG file with empty space with Java使用 Java 裁剪/修剪带有空白空间的 JPG 文件
【发布时间】:2011-11-15 04:24:09
【问题描述】:

是否有能够去除图像的空白(矩形)的框架。我们从技术图纸创建图像缩略图,不幸的是 PDF 格式。我们将 PDF 转换为 SVG,然后再转换为 JPG。通常技术图纸非常小,现在放置在缩略图的左上角:

+---------+----------------------+
|         |                      |
| (image) |                      |
|         |                      |
+---------+                      |
|                                |
|                                |
|                                |
|                                |
|              (empty space)     |
|                                |
|                                |
+--------------------------------+

那么我怎样才能轻松地删除空白空间并缩小 JPG 文件呢?

【问题讨论】:

  • 我原以为用几个循环来检查整行/列的颜色是否相同是相当容易的。 (或空的颜色)
  • 顺便说一句:将线条艺术转换为 JPEG 似乎是一个糟糕的选择。为什么不使用 PNG?
  • PDF 是否也包含空格或者内容的大小是否合适?如果它们的尺寸正确,那么您可能需要检查转换管道的每个步骤是否丢弃了一些尺寸信息。

标签: java image crop


【解决方案1】:

它可以在 JAI 中完成,如 this thread 所示。或者这是我刚刚编写的一些 Java 代码,可以用来做这件事:

public class TrimWhite {
    private BufferedImage img;

    public TrimWhite(File input) {
        try {
            img = ImageIO.read(input);
        } catch (IOException e) {
            throw new RuntimeException( "Problem reading image", e );
        }
    }

    public void trim() {
        int width  = getTrimmedWidth();
        int height = getTrimmedHeight();

        BufferedImage newImg = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics g = newImg.createGraphics();
        g.drawImage( img, 0, 0, null );
        img = newImg;
    }

    public void write(File f) {
        try {
            ImageIO.write(img, "bmp", f);
        } catch (IOException e) {
            throw new RuntimeException( "Problem writing image", e );
        }
    }

    private int getTrimmedWidth() {
        int height       = this.img.getHeight();
        int width        = this.img.getWidth();
        int trimmedWidth = 0;

        for(int i = 0; i < height; i++) {
            for(int j = width - 1; j >= 0; j--) {
                if(img.getRGB(j, i) != Color.WHITE.getRGB() &&
                        j > trimmedWidth) {
                    trimmedWidth = j;
                    break;
                }
            }
        }

        return trimmedWidth;
    }

    private int getTrimmedHeight() {
        int width         = this.img.getWidth();
        int height        = this.img.getHeight();
        int trimmedHeight = 0;

        for(int i = 0; i < width; i++) {
            for(int j = height - 1; j >= 0; j--) {
                if(img.getRGB(i, j) != Color.WHITE.getRGB() &&
                        j > trimmedHeight) {
                    trimmedHeight = j;
                    break;
                }
            }
        }

        return trimmedHeight;
    }

    public static void main(String[] args) {
        TrimWhite trim = new TrimWhite(new File("...\\someInput.bmp"));
        trim.trim();
        trim.write(new File("...\\someOutput.bmp"));
    }
}

【讨论】:

  • 我们如何使用 Color.TRANSLUCENT 进行修剪?
【解决方案2】:

对于 Android 用户,这里是一个使用 Mike Kwan 答案的示例:

    public static Bitmap TrimImage(Bitmap bmp) {
    int imgHeight = bmp.getHeight();
    int imgWidth  = bmp.getWidth();

    //TRIM WIDTH
    int widthStart  = imgWidth;
    int widthEnd = 0;
    for(int i = 0; i < imgHeight; i++) {
        for(int j = imgWidth - 1; j >= 0; j--) {
            if(bmp.getPixel(j, i) != Color.TRANSPARENT &&
                    j < widthStart) {
                widthStart = j;
            }
            if(bmp.getPixel(j, i) != Color.TRANSPARENT &&
                    j > widthEnd) {
                widthEnd = j;
                break;
            }
        }
    }
    //TRIM HEIGHT
    int heightStart = imgHeight;
    int heightEnd = 0;
    for(int i = 0; i < imgWidth; i++) {
        for(int j = imgHeight - 1; j >= 0; j--) {
            if(bmp.getPixel(i, j) != Color.TRANSPARENT &&
                    j < heightStart) {
                heightStart = j;
            }
            if(bmp.getPixel(i, j) != Color.TRANSPARENT &&
                    j > heightEnd) {
                heightEnd = j;
                break;
            }
        }
    }

    int finalWidth = widthEnd - widthStart;
    int finalHeight = heightEnd - heightStart;

    return Bitmap.createBitmap(bmp, widthStart,heightStart,finalWidth, finalHeight);
}

希望这对某人有所帮助:)

编辑:

伙计们,我刚刚更新了我的答案,因为最后一个代码只是修剪了图像的结尾,而不是开头。这个效果很好:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2016-07-17
    • 1970-01-01
    相关资源
    最近更新 更多