7

Chcę przyciąć obraz do jego mniejszego rozmiaru, wycinając białe obszary na obramowaniach. Wypróbowałem rozwiązanie sugerowane na tym forum Crop a PNG image to its minimum size, ale metoda getbbox() z pakietu pil zwraca ramkę ograniczającą o tym samym rozmiarze obrazu, tzn. Wydaje się, że nie rozpoznaje pustych obszarów wokół. Próbowałem następujące:Metoda getbbox z biblioteki obrazów Pythona (PIL) nie działa

>>>import Image 
>>>im=Image.open("myfile.png") 
>>>print im.format, im.size, im.mode 
>>>print im.getbbox() 
PNG (2400,1800) RGBA 
(0,0,2400,1800) 

Sprawdziłem, że mój obraz ma prawdziwie białe croppable granic przycinając obraz z GIMP auto-upraw. Próbowałem także z wersjami ps i eps postaci, bez szczęścia.
Każda pomoc będzie bardzo ceniona.

Odpowiedz

16

Kłopoty to getbbox() uprawy poza czarnymi granicami, od dokumentów: Calculates the bounding box of the non-zero regions in the image.

enter image description hereenter image description here

import Image  
im=Image.open("flowers_white_border.jpg") 
print im.format, im.size, im.mode 
print im.getbbox() 
# white border output: 
JPEG (300, 225) RGB 
(0, 0, 300, 225) 

im=Image.open("flowers_black_border.jpg") 
print im.format, im.size, im.mode 
print im.getbbox() 
# black border output: 
JPEG (300, 225) RGB 
(16, 16, 288, 216) # cropped as desired 

Możemy zrobić łatwo naprawić na białym obramowaniem, najpierw poprzez odwracanie obrazu z wykorzystaniem ImageOps.invert, a następnie użyj getbbox():

import ImageOps 
im=Image.open("flowers_white_border.jpg") 
invert_im = ImageOps.invert(im) 
print invert_im.getbbox() 
# output: 
(16, 16, 288, 216) 
+3

Dziękuję dużo za szybko i wyraźna odpowiedź. To zadziałało, ale musiałem najpierw przekonwertować RGBA na RGB przed użyciem inwersji, wywołując funkcję convert: invert_im = im.convert ("RGB"), a następnie invert_im = ImageOps.invert (invert_im), w przeciwnym razie uzyskałem IOError " nieobsługiwane w tym trybie obrazu ". – etepoc

+0

@ user1292774 - fajnie, cieszę się że działało .., jeśli chcesz, możesz awansować/i zaznaczyć strzałkę, aby zaakceptować odpowiedź, w lewym górnym rogu, oboje otrzymujemy punkty;) – fraxel

+0

Już próbowałem przegłosować, ale Mam mniej niż 15 punktów i system nie pozwala mi na razie, zrobię to, jeśli kiedykolwiek zdobędę te 15 punktów. Dziękuję Ci! – etepoc

Powiązane problemy