Python تحويل صورة 12 بت مشفرة في سلسلة إلى 8 بت PNG

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

  •  26-09-2019
  •  | 
  •  

سؤال

لديّ سلسلة تتم قراءتها من كاميرا 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 الآن

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