Python تحويل صورة 12 بت مشفرة في سلسلة إلى 8 بت PNG
سؤال
لديّ سلسلة تتم قراءتها من كاميرا USB Apogee التي تمثل صورة رمادية 12 بت مع 12 بت تشغل كل منها أقل 12 بت من الكلمات 16 بت. أريد إنشاء PNG 8 بت من هذه السلسلة من خلال تجاهل أقل 4 بت.
يمكنني تحويلها إلى صورة 16 بت حيث تكون أعلى 4 بتات دائمًا صفرية باستخدام PIL مع
import Image
#imageStr is the image string
#imageSize is the image size
img=Image.fromstring("I", imageSize, imageStr, "raw", "I;16", 0,1)
img.save("MyImage.png", "PNG")
على أي حال ، هل يمكنني القيام بشيء مشابه لإنشاء صورة 8 بت دون تفريغ السلسلة تمامًا التي تقوم بالحساب وصنع سلسلة جديدة؟
تحرير: تعليق Wumps حول تحويل صورة أعطاني فكرة ، وفعلت ذلك
img = img.point(lambda i: i * 16, "L") #shifts by 4 bits and converts to 8-bit image.
شكرا وامب
المحلول
لقد أعطاني تعليق Wump حول تحويل صورة فكرة ، وفعلت ذلك
#shifts by 4 bits and converts to 8-bit image
img = img.point(lambda i: i * 16, "L")
شكرا وامب
نصائح أخرى
الطريقة الوحيدة التي أعرف بها كيف أفعل ذلك ستكون:
data = numpy.fromstring(imageStr, numpy.uint16)
data >>= 4 # shift out four bits
data = numpy.array(data, dtype=numpy.uint8)
img = Image.fromarray(data.reshape(imageSize))
في Principe ، يمكن لـ PIL تحويل الصور بهذه الطريقة:
img = img.convert("L")
لكن المشكلة هي أنه ليس لديها طريقة لتقليل الدقة إلى 8 بت (AFAIK) ، لذلك سيتم قص كل شيء إلى 255 :)
تحرير: تحويل السلسلة المتوسطة التي تم إزالتها ، فهي تسير مباشرة من Numpy إلى Pil الآن