بدائل التصوير بايثون
-
10-07-2019 - |
سؤال
لدي كود بايثون يحتاج إلى القيام ببعض الأشياء البسيطة للصور الفوتوغرافية:قص العلامة المائية وتغيير حجمها وتراكبها.لقد استخدمت PIL، وكانت نتائج إعادة التشكيل/تغيير الحجم رهيبة.لقد استخدمت imagemagick، وتم تصميم الواجهة والأوامر من خلال تعبئة قطة في صندوق، ثم رميها بشكل متكرر على مجموعة من السلالم على لوحة المفاتيح.
أنا أبحث عن شيء ليس PIL أو Imagemagick يمكنني استخدامه مع python لإجراء تحويلات صور بسيطة وعالية الجودة.في هذا الصدد، ليس من الضروري أن تحتوي على روابط بايثون إذا كانت واجهة سطر الأوامر جيدة.
أوه، ويجب أن يكون الأمر مستقلاً نسبيًا عن النظام الأساسي، فخوادم الإنتاج لدينا تعمل بنظام التشغيل Linux، لكن بعض مطورينا يتطورون على نظام التشغيل Windows.ولا يمكن أن يتطلب تثبيت مجموعة من أكواد واجهة المستخدم الرسومية السخيفة لاستخدامها كمكتبة أيضًا.
المحلول
لقد استخدمت PIL، وكانت نتائج إعادة التشكيل/تغيير الحجم رهيبة.
لا ينبغي أن يكونوا كذلك، طالما أنك:
- استخدم فقط تصفية Image.ANTIALIAS لعمليات تصغير الحجم
- استخدم فقط تصفية Image.BICUBIC لعمليات الارتقاء.
- تذكر أن تقوم بالتحويل إلى وضع الألوان "RGB" قبل تغيير الحجم إذا كنت تستخدم صورة ملونة
- لا تستخدم .thumbnail().انها حماقة
- تعيين
quality=
المستوى إلى شيء مناسب عند حفظ ملفات JPEG (الإعداد الافتراضي منخفض جدًا)
نصائح أخرى
وأنا غير متأكد لماذا Image.thumbnail هو الحصول على مثل هذا واقية من الرصاص. في الإصدار الحالي أنني يلوذ بالفرار منه لا أكثر قليلا من معرفة الحجم المطلوب وتغيير حجم الصورة في المكان. طالما كنت تستخدم فلتر إعادة تشكيله الصحيح وتحويلها إلى RGB أولا (كما يقول bobince) يجب المصغرات ألا تكون مختلفة من حجمها.
إليك المصدر الفعلي للأسلوب المصغرة:
def thumbnail(self, size, resample=NEAREST):
# preserve aspect ratio
x, y = self.size
if x > size[0]: y = max(y * size[0] / x, 1); x = size[0]
if y > size[1]: x = max(x * size[1] / y, 1); y = size[1]
size = x, y
if size == self.size:
return
self.draft(None, size)
self.load()
try:
im = self.resize(size, resample)
except ValueError:
if resample != ANTIALIAS:
raise
im = self.resize(size, NEAREST) # fallback
self.im = im.im
self.mode = im.mode
self.size = size
self.readonly = 0
وPIL يمكن القيام به تغيير حجم جيد. تأكد من مصدر الصورة الخاصة بك في وضع RGB، وليس وحة الألوان، ومحاولة الخيارات خوارزمية مختلفة.
هل راجعت pypi ؟ أظهر بحث سريع بعض الأدوات المتعلقة صورة هناك، اكتشفت أيضا بيثون كلمة المدير العام، أي فكرة كيف مفيدة قد يكون بالرغم من ذلك.
وأنا لم أصب أي مشاكل مع PIL نفسي، ولكن نوعا من التنوع قد تكون مثيرة للاهتمام.
والأعرج واجهة سطر الأوامر معقولة، على ما أعتقد.
ألقِ نظرة على بعض مكتبات التصوير هذه:
hxxp://pypi.python.org/pypi/collective.croppingimagefield/0.1beta
hxxp://pypi.python.org/pypi/cropresize/0.1.1
hxxp://pypi.python.org/pypi/image_resize/1.0
وآخر مرة مقارنة، خرج هذا downscaler هو مطابق تقريبا لتلك التي خيار جمب "مكعب":
import Image
def stretch(im, size, filter=Image.NEAREST):
im.load()
im = im._new(im.im.stretch(size, filter))
return im
وIIRC، فإن الاختلافات لا يمكن تمييزها بصريا - بعض بكسل القيم +/- 1 بسبب التقريب، وأنها تميل إلى أن تكون جولة الحواف. انها ليست بطيئة سواء.
وCF: HTTP: //www.mail-archive كوم / صورة سيج @ python.org / msg00248.html