كيف يمكن للمرء أن يتحول اللون مع ملامح ICC على مجموعة من قيم البكسل التعسفي (وليس على بنية بيانات الصورة)؟

StackOverflow https://stackoverflow.com/questions/3597528

سؤال

أرغب في تحويل مجموعة من قيم البكسل من مساحة ألوان مرفقة إلى أخرى ، دون أن تكون هذه القيم الموجودة في ملف صورة ، مثل (على سبيل المثال) قائمة بهياكل بيانات RGB/RGBA/CMYK/ETC.

لدي بيثون و بيل تحت تصرفي ، لكنني مهتم بالحلول في البيئات ذات الصلة إذا كان هذا ما يتطلبه الأمر.

أحدث PIL لديه دعم رائع للغاية ل littlecms - ولكن لا توجد طريقة لتسليمها أي شيء آخر غير صورة PIL (أو كائن PYCMS LEGACY) حتى يتصرف عليها.

بقدر ما أستطيع التأكد ، أداة سطر الأوامر icctrans يتم تضمينه مع LittleCms يفعل شيئًا من هذا النوع ، لكن لا يمكنني العثور على أي وثائق غير الهيكلية عليه ، وتشير الوثائق إليه كأداة عرض.

هل كانت مفيدة؟

المحلول

من أجل استخدام إصدار 2.3 الحالي من القليل من CMS مع بيثون ، ترجمت lcms2.h إلى lcms2consts.py مع ال h2py.py السيناريو الذي يأتي في توزيع بيثون. لا يترجم البرنامج النصي عن إعلانات الهيكل ، لكن الثوابت كافية للقيام بتحولات الألوان الأساسية مع ctypes و lcms2 كمكتبة ديناميكية.

يحول هذا المثال لونًا واحدًا من مختبر دقة مزدوجة إلى SRGB 8 بت باستخدام ملفات تعريف مدمجة. يستخدم cmsOpenProfileFromFile(filename, 'r') بدلا من ذلك للملفات.

import ctypes
from ctypes import byref
from lcms2consts import *

lcms = ctypes.windll.lcms2

inprof = lcms.cmsCreateLab4Profile(0)
outprof = lcms.cmsCreate_sRGBProfile()
xform = lcms.cmsCreateTransform(inprof, TYPE_Lab_DBL, 
    outprof, TYPE_RGB_8,
    INTENT_PERCEPTUAL, 0)
lcms.cmsCloseProfile(inprof)
lcms.cmsCloseProfile(outprof)

DblTriplet = ctypes.c_double * 3
ByteTriplet = ctypes.c_ubyte * 3
inbuf = DblTriplet(60.1,20.2,0.5)
outbuf = ByteTriplet()
lcms.cmsDoTransform(xform, byref(inbuf), byref(outbuf), 1)
print list(outbuf)

lcms.cmsDeleteTransform(xform)

نصائح أخرى

هناك طريقتان.

  • طريق الاختراق: لإعادة تشغيل هياكل الألوان n (و/أو تحويلها بين Colorpaces) يمكنك إنشاء صورة 1x (n+2) مع PIL.Image.new(), ، استعمال yourimage.load() للحصول على شيء واجهة كائن وضع بكسل ، وضبط القيم (0،0) من خلال (0 ، n) إلى كل ما حصلت عليه. تعيين (0 ، n+1) إلى الأبيض و (0 ، n+2) إلى الأسود ، وتحويل (أو إثبات التحول) تلك الصورة باستخدام ملفات ICC المفضلة لديك و PIL.ImageCms.ImageCmsTransform(). بلامو: كائن بيل الآن هو لوت الخاص بك. اقرأ القيم مع image.load() شيء ما وأنت جيد.

  • الطريقة الحقيقية: تحتاج إلى استخدام بيثون كولورماث - وهو أمر رائع لتحويل Colorspace ولكن ليس التنميط. لا يمكن لـ Colormath قراءة ملفات تعريف ICC ، لذا إما أ) يمكنك الحصول على تحليلها الثنائي المجنون بطريقة موثوقة ، أو ب) فقط افعل الرياضيات, ، حرفيا. يحتوي هذا الرجل بروس ليندبلوم على جميع البيانات المتوفرة بتنسيق Excel ، مثل ، كل المصفوفات تحتاج إلى إعادة صياغة luts الخاصة بك. إنه رائع تمامًا. ما زلت أحاول "فقط" إطعام هذه البيانات في Colormath ، لذلك نعم ، هذا يجعلني أقل روعة لأنني ما زلت أحاول الحصول على هذه "الطريق الطالب الذي يذاكر كثيرا" إلى شيء يشبه جودة الإنتاج.

ها أنت ذا. هذا ما فعلته حتى الآن للإجابة على مسألة تحويلات ICC LUT ذات الطراز القائم بذاته. يا رفاق ، srsly.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top