Создайте 16-битное изображение TIFF из строки Python

Мне нужно использовать сканер с 16-битной глубиной и цветовым режимом, поэтому я изменил python-imaging-sane (который не поддерживает RGB tiff с 16-битной глубиной), чтобы получать от сканера (epson v500) изображение в строке Python.

это модифицированная функция, которую я использую для отправки данных со сканера в строку Python:

#define READSIZE 32768

static PyObject *
SaneDev_read(SaneDevObject *self, PyObject *args)
{
SANE_Status st;
unsigned char c_buf[READSIZE];
SANE_Int len, maxlen;
maxlen = READSIZE;
if (!PyArg_ParseTuple(args, ""))
{
        return NULL;
}
st = (int) sane_read(self->h, (SANE_Byte *) c_buf, maxlen, &len);
return Py_BuildValue("is#", st, c_buf, len);
}

я использую этот скрипт Python для получения и использования данных:

import sane
import pgmagick
import cStringIO

sane.init()

s = sane.open(sane.get_devices()[0][0])

s.mode = 'Color'
s.source = 'Transparency Unity'

s.tl_x = 15
s.tl_y = 30
s.br_x = 52
s.br_y = 55

s.x_resolution = 1600
s.y_resolution = 1600

s.depth = 16

fbuffer = cStringIO.StringIO()

s.start()

par = s.get_parameters()
print "par = ", par

st = 0
while st is 0:
    st, buf = s.read()
    fbuffer.write(buf)

s.cancel()

data = fbuffer.getvalue()
fbuffer.close()

px = par[2][0]
py = par[2][1]
bytesperlines = par[4]
depth = par[3]

size = "%sx%s" % (px, py)
blob = pgmagick.Blob(data)
im  = pgmagick.Image()
im.density("1600x1600")
im.depth(depth)
im.size(size)
im.magick('RGB')
im.resolutionUnits(gm.ResolutionType.PixelsPerInchResolution)
im.read(blob)
im.write("img.tiff")

скрипт очень хорошо работает с глубиной 8 бит, но с глубиной 16 бит я получаю изображение с неправильными цветами;

это два примера:

с 8-битной глубиной

с глубиной 16 бит

в чем проблема?

РЕДАКТИРОВАТЬ: я использую pgmagick, оболочку python для graphicsmagick; Graphicsmagick скомпилирован с квантовой глубиной, установленной на 16 бит.


person ilmioalias    schedule 07.08.2011    source источник
comment
Я добавил свой комментарий в качестве ответа. Пожалуйста, нажмите на галочку рядом с ним, чтобы принять его.   -  person agf    schedule 08.08.2011
comment
@agf: спасибо, это работает! я сохранил данные непосредственно в массиве python (с помощью fromstring()) и использовал byteswap() для замены байтов, после чего я извлек строку из массива с помощью tostring().   -  person ilmioalias    schedule 08.08.2011


Ответы (1)


Вероятно, у вас неправильный порядок байтов. Попробуйте поменять местами два байта, составляющие шестнадцатибитные данные, и посмотрите, что получится.

person agf    schedule 08.08.2011