Wie schneidet man den leeren Randbereich eines PNG-Bildes ab und verkleinert es mit Python auf seine Mindestgröße?
Antworten
Zu viele Anzeigen?
Frank Krueger
Punkte
67044
Sie können verwenden PIL um Zeilen und Spalten Ihres Bildes zu finden, die ausschließlich aus Ihrer Rahmenfarbe bestehen.
Anhand dieser Informationen können Sie die Ausmaße des eingefügten Bildes leicht bestimmen.
Mit PIL können Sie das Bild dann erneut zuschneiden, um den Rand zu entfernen.
Ilya Bossov
Punkte
1
Die anderen Antworten haben für mich beim Schreiben eines Blender-Skripts nicht funktioniert (ich kann PIL nicht verwenden), also vielleicht findet jemand anderes dies nützlich.
import numpy as np
def crop(crop_file):
"""crop the image, removing invisible borders"""
image = bpy.data.images.load(crop_file, check_existing=False)
w, h = image.size
print("Original size: " + str(w) + " x " + str(h))
linear_pixels = image.pixels[:]
pixels4d = np.reshape(linear_pixels, (h, w, 4))
mask = pixels4d [:,:,3] != 0.
coords = np.argwhere(mask)
y0, x0 = coords.min(axis=0)
y1, x1 = coords.max(axis=0) + 1
cropped_box = pixels4d[y0:y1, x0:x1, :]
w1, h1 = x1 - x0, y1 - y0
print("Crop size: " + str(w1) + " x " + str(h1))
temp_image = bpy.data.images.new(crop_file, alpha=True, width=w1, height=h1)
temp_image.pixels[:] = cropped_box.ravel()
temp_image.filepath_raw = crop_file
temp_image.file_format = 'PNG'
temp_image.alpha_mode = 'STRAIGHT'
temp_image.save()
- See previous answers
- Weitere Antworten anzeigen