как конвертировать необработанные изображения в png в python?

У меня есть папка, содержащая более 200 изображений raw, я хочу преобразовать их все в png или любой другой формат. В C это довольно просто, но в python я не знаю, как это делается.

Я нашел этот фрагмент

#import struct
import numpy, array, PIL, Image
from struct import *

#declarations
arr1D   =   array.array('H') #H is unsigned short

#------------------------------------
#read 16 bit unsigned raw depth image
#------------------------------------
w           =   640
h           =   480
fid        =   open('/home/salman/salman/NiSimpleRead_salman/data/200.raw')
#fid         =   open('/home/salman/test.raw')
numBytes    =   w*h
arr1D.read(fid, numBytes)
fid.close()

#----------------------------------------------------
#convert to float numpy array -> scale -> uint8 array
#----------------------------------------------------
numarr = numpy.array(arr1D, dtype='float');
numarr = 255 - (numarr*255.0/numarr.max())
numarr.shape = (h,w)
numarr = numarr.astype('uint8')

#======================
#IMAGES
#======================

#2D numpy array -> image 
#-----------------------
img        =   Image.fromarray(numarr); #print data.dtype.name

#image view and save
#-------------------
#img.show()
img.save('/home/salman/test.png')

Это единственный фрагмент, который я могу найти, это правильный способ сделать это?


person user    schedule 29.03.2012    source источник
comment
В качестве альтернативы используйте ImageMagick в командной строке: convert *.raw --format png.   -  person Li-aung Yip    schedule 29.03.2012
comment
Или попеременно использовать привязки ImageMagick для Python.   -  person Li-aung Yip    schedule 29.03.2012
comment
В C это довольно просто - можете указать на это?   -  person jsbueno    schedule 29.03.2012
comment
@jsbueno, говоря в C это довольно просто, я имел в виду, что я видел так много фрагментов, конвертирующих raw в другие форматы, но я видел только 1 фрагмент в python.   -  person user    schedule 30.03.2012


Ответы (2)


Это должно быть что-то вроде:

rawData = open("foo.raw" 'rb').read()
imgSize = (x,y)
# Use the PIL raw decoder to read the data.
# the 'F;16' informs the raw decoder that we are reading 
# a little endian, unsigned integer 16 bit data.
img = Image.fromstring('L', imgSize, rawData, 'raw', 'F;16')
img.save("foo.png")

Используя руководство и еще один SO-вопрос.

Первый аргумент — это режим изображения и может быть любым из:

  • 1 (1-битные пиксели, черно-белые, хранятся по одному пикселю на байт)
  • L (8-битные пиксели, черно-белые)
  • P (8-битные пиксели, сопоставленные с любым другим режимом с использованием цветовой палитры)
  • RGB (3x8-битных пикселей, истинный цвет)
  • RGBA (4x8-битных пикселей, истинный цвет с маской прозрачности)
  • CMYK (4x8-битных пикселей, цветоделение)
  • YCbCr (пиксели 3x8 бит, формат цветного видео)
  • I (32-битные целые пиксели со знаком)
  • F (32-битные пиксели с плавающей запятой)
person brice    schedule 29.03.2012
comment
F;16 больше не является истинным целым числом без знака. Я думаю, что они теперь используют его как поплавок. Если я не ошибаюсь. - person majidarif; 06.10.2018
comment
Этот ответ больше не является точным. См.: stackoverflow.com/a/45445890/8055011 - person Harshit Jindal; 07.03.2020
comment
Как сделать обратное этому? У меня есть ndarray, и я хочу записать изображение в формате (.raw)? - person Uday Posia; 17.08.2020

from PIL import Image
rawData = open("foo.raw", 'rb').read()
imgSize = (703,1248)# the image size
img = Image.frombytes('L', imgSize, rawData)
img.save("foo.jpg")# can give any format you like .png

был тот, который работал на меня

person Anupiya Nugaliyadde    schedule 01.08.2017
comment
Как сделать обратное этому? У меня есть ndarray, и я хочу записать изображение в формате (.raw)? - person Uday Posia; 17.08.2020