Обрезать изображение PNG до минимального размера - PullRequest
10 голосов
/ 15 декабря 2009

Как обрезать пустую рамочную область изображения PNG и уменьшить его до минимального размера с помощью Python?

Ответы [ 5 ]

16 голосов
/ 15 декабря 2009

PIL s getbbox работает на меня

im.getbbox () => 4-кортеж или нет

Рассчитывает ограничивающую рамку ненулевые области на изображении. ограничивающий прямоугольник возвращается как 4-кортеж определяя левый, верхний, правый и координата нижнего пикселя. Если изображение совершенно пустой, этот метод возвращает None.

Пример кода, который я пробовал, я протестировал с bmp, но он должен работать и для png.

>>> import Image
>>> im=Image.open("test.bmp")
>>> im.size
(364, 471)
>>> im.getbbox()
(64, 89, 278, 267)
>>> im2=im.crop(im.getbbox())
>>> im2.size
(214, 178)
>>> im2.save("test2.bmp")
4 голосов
/ 22 июня 2017

У меня была такая же проблема сегодня. Вот мое решение обрезать прозрачные границы. Просто добавьте этот скрипт в вашу папку с вашими пакетными файлами .png:

from PIL import Image
import numpy as np
from os import listdir

def crop(png_image_name):
    pil_image = Image.open(png_image_name)
    np_array = np.array(pil_image)
    blank_px = [255, 255, 255, 0]
    mask = np_array != blank_px
    coords = np.argwhere(mask)
    x0, y0, z0 = coords.min(axis=0)
    x1, y1, z1 = coords.max(axis=0) + 1
    cropped_box = np_array[x0:x1, y0:y1, z0:z1]
    pil_image = Image.fromarray(cropped_box, 'RGBA')
    print(pil_image.width, pil_image.height)
    pil_image.save(png_image_name)
    print(png_image_name)

for f in listdir('.'):
    if f.endswith('.png'):
        crop(f)
3 голосов
/ 19 июля 2012

https://gist.github.com/3141140

import Image
import sys
import glob

# Trim all png images with alpha in a folder
# Usage "python PNGAlphaTrim.py ../someFolder"

try:
    folderName = sys.argv[1]
except :
    print "Usage: python PNGPNGAlphaTrim.py ../someFolder"
    sys.exit(1)

filePaths = glob.glob(folderName + "/*.png") #search for all png images in the folder

for filePath in filePaths:
    image=Image.open(filePath)
    image.load()

    imageSize = image.size
    imageBox = image.getbbox()

    imageComponents = image.split()

    if len(imageComponents) < 4: continue #don't process images without alpha

    rgbImage = Image.new("RGB", imageSize, (0,0,0))
    rgbImage.paste(image, mask=imageComponents[3])
    croppedBox = rgbImage.getbbox()

    if imageBox != croppedBox:
        cropped=image.crop(croppedBox)
        print filePath, "Size:", imageSize, "New Size:",croppedBox
        cropped.save(filePath)
1 голос
/ 15 декабря 2009

Вы можете использовать PIL , чтобы найти строки и столбцы вашего изображения, которые состоят исключительно из вашего цвета рамки.

Используя эту информацию, вы можете легко определить размеры инкрустированного изображения.

PIL снова позволит вам обрезать изображение, чтобы убрать границу.

0 голосов
/ 29 февраля 2016

Я думаю, что необходимо дополнить ответ @Frank Krueger. Он делает хорошее замечание, но это не включает в себя, как правильно обрезать дополнительный цвет рамки из изображения. Я обнаружил, что здесь . В частности, я нашел это полезным:

from PIL import Image, ImageChops

def trim(im):
    bg = Image.new(im.mode, im.size, im.getpixel((0,0)))
    diff = ImageChops.difference(im, bg)
    diff = ImageChops.add(diff, diff, 2.0, -100)
    bbox = diff.getbbox()
    if bbox:
        return im.crop(bbox)

im = Image.open("bord3.jpg")
im = trim(im)
im.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...