TWAIN Working Group

Newsletter Signup
Donate
Help keep TWAIN free
  • About TWAIN
    • What’s New?
    • News
    • Events
    • Membership
    • Consider a Donation
    • Contact Us
  • Why TWAIN?
  • Developers
    • Driver Developer
    • Application Developer
    • TWAIN Features
    • Specification & Tools
    • Self Certification Process
  • Support Forums
  • Scanner End-User
  • Find Certified Drivers
    • Facebook
    • LinkedIn
    • Vimeo

Reply To: 8-Bit image, memory transfer, algorithm problem

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
Billie
Participant
  • Topics - 2
  • Replies - 5
  • Total Posts - 7

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);
}

Quick Links

Service Providers
TWAIN Support Forums
Membership
Contact Us
Privacy Policy

Newsletter Signup

TWAIN Working Group Family

TWAIN Working Group
TWAIN Direct®
TWAIN Resources
TWAIN Certified Drivers
PDF/raster

  • Facebook
  • GitHub
  • LinkedIn
  • Vimeo

Recent Topics

  • EPSON V600 TWAIN and WIA on Windows 10
  • When and how to use WaitForEvents command ?
  • Problem enumerating list of installed scanners in windows server 2012
  • Failed to create TWAIN progress! Error code is 1260.
  • To get the list of scanners from javascript client side (browser)
  • Quarterly Newsletter
  • TWAIN Working Group Membership
  • Logo Usage
  • TWAIN License
  • Contact Us
Privacy Policy • Privacy Tools • Copyright © 2021 TWAIN Working Group • by iHwy, LLC • Log in