2011-09-12 35 views
7

Có khung làm việc có thể xóa không gian màu trắng (hình chữ nhật) của hình ảnh hay không. Chúng tôi tạo hình thu nhỏ hình ảnh từ các bản vẽ kỹ thuật vốn không may ở định dạng PDF. Chúng tôi chuyển đổi PDF sang SVG và sau đó sang JPG. Thường thì các bản vẽ kỹ thuật rất nhỏ và hiện được đặt ở góc trên bên trái của hình thu nhỏ:Cắt/cắt tệp JPG với khoảng trống bằng Java

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

Vậy làm cách nào để tôi có thể dễ dàng xóa không gian trống và thu nhỏ tệp JPG?

+0

Tôi đã nghĩ rằng khá dễ dàng để tự làm với một vài vòng để kiểm tra toàn bộ hàng/cột có cùng màu. (Hoặc màu trống) –

+5

BTW: chuyển đổi dòng nghệ thuật sang JPEG có vẻ là một lựa chọn tồi. Tại sao không sử dụng PNG? –

+2

Các tệp PDF có bao gồm khoảng trắng hoặc kích thước phù hợp cho nội dung không? Nếu chúng được định kích thước chính xác, thì bạn có thể muốn kiểm tra từng bước của đường ống chuyển đổi nếu nó loại bỏ một số thông tin kích thước. –

Trả lời

7

Có thể thực hiện trong JAI như được minh họa trong this thread. Hoặc đây là một số mã Java tôi chỉ viết có thể được sử dụng để làm điều đó:

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")); 
    } 
} 
+0

Làm thế nào chúng ta có thể cắt với Color.TRANSLUCENT? –

6

Đối với người dùng Android, đây là một ví dụ sử dụng Mike Kwan trả lời:

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); 
} 

Hope trợ giúp này một ai đó :)

CHỈNH SỬA:

Các bạn, tôi vừa cập nhật câu trả lời cuz mã cuối cùng của tôi vừa mới cắt bớt phần cuối của hình ảnh chứ không phải phần đầu. Cái này đang hoạt động rất tốt :)

Các vấn đề liên quan