16ビット深度とカラーモードでスキャナーを使用する必要があるため、Python文字列の画像をスキャナー(epson v500)から受信するようにpython-imaging-sane(16ビット深度のRGB tiffをサポートしていません)を変更しました。
これは、スキャナーから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ビットに設定すると、間違った色の画像が得られます。
これらは2つの例です。
問題はどこだ?
編集:graphicsmagickのPythonラッパーであるpgmagickを使用します。graphicsmagickは、量子深度を16ビットに設定してコンパイルされます。