Обрезать / обрезать файл JPG с пустым пространством с помощью Java - PullRequest
9 голосов
/ 12 сентября 2011

Есть ли рамки, способные убрать пустое пространство (прямоугольное) изображения. Мы создаем эскизы изображений из технических чертежей, которые, к сожалению, представлены в формате PDF. Мы конвертируем PDF в SVG, а затем в JPG. Часто технические чертежи очень маленькие и теперь размещаются в верхнем левом углу эскиза:

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

Так, как я могу легко удалить пустое место и сжать файл JPG?

Ответы [ 2 ]

9 голосов
/ 12 сентября 2011

Это можно сделать в JAI, как показано в этой теме . Или вот код 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"));
    }
}
7 голосов
/ 07 мая 2015

Для пользователей 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);
}

Надеюсь, это кому-нибудь поможет:)

РЕДАКТИРОВАТЬ:

Ребята, я только что обновилмой ответ, потому что последний код просто обрезал конец изображения, а не начало.Этот работает просто замечательно:)

...