Home › Forums › TWAIN Classic › 8-Bit image, memory transfer, algorithm problem › Reply To: 8-Bit image, memory transfer, algorithm problem
March 24, 2010 at 8:49 am #25115
Hy McOhen!
Heres the complete Method for the memory transfer. I use Java as programming language and JNI (Java Native Interface) to map the Java-Objects to C-Structures. Ask if you don’t understand parts of the code. A great Help was the Twain Sample App Source.
private void initiateTransfer_Memory() {
String method = "initiateTransfer_Memory()";
TwainImageInfo twImageInfo = null;
TwainSetupMemXfer bufferSizes = null;
TwainPendingXfers pendingXfers = null;
List bufferedImages = null;
try {
twImageInfo = new TwainImageInfo();
bufferSizes = new TwainSetupMemXfer();
pendingXfers = new TwainPendingXfers();
do {
checkTWRC(dsmEntry(appID, dsID, DG.IMAGE, DAT.IMAGEINFO, MSG.GET, twImageInfo));
checkTWRC(dsmEntry(appID, dsID, DG.CONTROL, DAT.SETUPMEMXFER, MSG.GET, bufferSizes));
if (LOG.isDebugEnabled()) {
LOG.debug(method, "twImageInfo=" + twImageInfo + ",bufferSizes=" + bufferSizes);
}
BufferedImage bfImage = new BufferedImage(twImageInfo.getImageWidth(), twImageInfo
.getImageLength(), BufferedImage.TYPE_INT_RGB);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(bufferSizes.getPreferred());
TwainImageMemXfer memXferBuf = null;
try {
memXferBuf = new TwainImageMemXfer();
memXferBuf.setBytesPerRow(TWON_DONTCARE32);
memXferBuf.setBytesWritten(TWON_DONTCARE32);
memXferBuf.setColumns(TWON_DONTCARE32);
memXferBuf.setCompression(TWON_DONTCARE16);
memXferBuf.setRows(TWON_DONTCARE32);
memXferBuf.setXOffset(TWON_DONTCARE32);
memXferBuf.setYOffset(TWON_DONTCARE32);
memXferBuf.getMemory().setFlags(EnumSet.of(TWMF.APPOWNS, TWMF.POINTER));
memXferBuf.getMemory().setLength(bufferSizes.getPreferred());
memXferBuf.getMemory().setTheMem(byteBuffer);
int bitsPerPixel = twImageInfo.getBitsPerPixel();
int y = 0;
byte[] rgb = new byte[3];
while (true) {
byteBuffer.clear();
TWRC twRC = dsmEntry(appID, dsID, DG.IMAGE, DAT.IMAGEMEMXFER, MSG.GET, memXferBuf);
if (TWRC.SUCCESS.equals(twRC) || TWRC.XFERDONE.equals(twRC)) {
if (LOG.isDebugEnabled()) {
LOG.debug(method, "memXferBuf=" + memXferBuf);
}
int rows = memXferBuf.getRows();
int columns = memXferBuf.getColumns();
for (int i = 0; i < rows; i++) {
for (int x = 0; x < columns; x++) {
switch (bitsPerPixel) {
case 8:
byte b = byteBuffer.get();
rgb[0] = b;
rgb[1] = b;
rgb[2] = b;
break;
case 24:
byteBuffer.get(rgb);
break;
}
bfImage.setRGB(x, y, (rgb[0] & 0xff) << 16
| (rgb[1] & 0xff) << 8
| (rgb[2] & 0xff));
}
y++;
int extraBytes = 0;
switch (bitsPerPixel) {
case 8:
extraBytes = memXferBuf.getBytesPerRow() - columns;
break;
case 24:
extraBytes = memXferBuf.getBytesPerRow() - (columns * 3);
break;
}
byteBuffer.position(byteBuffer.position() + extraBytes);
}
if (TWRC.XFERDONE.equals(twRC)) {
if (bufferedImages == null) {
bufferedImages = new ArrayList ();
}
bufferedImages.add(bfImage);
break;
}
} else {
try {
checkTWRC(twRC);
} catch (TwainException e) {
LOG.error(method, "Error transfering image", e);
}
break;
}
}
} finally {
if (memXferBuf != null) {
memXferBuf.free();
}
}
checkTWRC(dsmEntry(appID, dsID, DG.CONTROL, DAT.PENDINGXFERS, MSG.ENDXFER, pendingXfers));
} while (pendingXfers.getCount() != 0);
} catch (TwainException e) {
LOG.error(method, "Error initiating memory transfer", e);
} finally {
if (twImageInfo != null) {
twImageInfo.free();
}
if (bufferSizes != null) {
bufferSizes.free();
}
if (pendingXfers != null) {
pendingXfers.free();
}
}
notifyMemoryTransferListeners(bufferedImages);
}