2011-09-12 16 views
7

Czy istnieje struktura, która jest w stanie usunąć biały obszar (prostokątny) obrazu. Tworzymy miniaturki obrazów z rysunków technicznych, które niestety są w formacie PDF. Konwertujemy plik PDF na SVG, a następnie na JPG. Często rysunki techniczne są bardzo małe, a teraz umieszczony w lewym górnym rogu miniatury:Przycinanie/przycinanie pliku JPG z pustą przestrzenią z Javą

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

jaki sposób można łatwo usunąć pustą przestrzeń i zmniejszyć plik JPG?

+0

Pomyślałbym, że było to dość łatwe do zrobienia z kilkoma pętlami, aby sprawdzić całe rzędy/kolumny były tego samego koloru. (Lub pusty kolor) –

+5

BTW: konwertowanie grafiki liniowej na JPEG wydaje się złym wyborem. Dlaczego nie skorzystać z PNG? –

+2

Czy pliki PDF zawierają również białe znaki lub czy mają odpowiednią wielkość? Jeśli mają one właściwy rozmiar, możesz sprawdzić każdy etap potoku konwersji, jeśli odrzuca pewne informacje o rozmiarze. –

Odpowiedz

7

Można to zrobić w JAI, jak pokazano w this thread. Lub tutaj niektóre kodu Java Właśnie napisałem, które mogą być wykorzystane, aby to zrobić:

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

Jak możemy przycinać za pomocą Color.TRANSLUCENT? –

6

Dla użytkowników Androida, tutaj jest przykład przy użyciu Mike Kwan odpowiedź:

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

Nadzieja to pomaga ktoś :)

EDIT:

Chłopaki, ja po prostu aktualizowana moją odpowiedź bo ostatni kod został właśnie przycinanie koniec obrazu, a nie na początku. Ten działa po prostu świetnie :)