Clipboard Quicker than MathLink?
- To: mathgroup at smc.vnet.net
- Subject: [mg20563] Clipboard Quicker than MathLink?
- From: simon shannon <sshannon at taz.dra.hmg.gb>
- Date: Sat, 30 Oct 1999 00:14:10 -0400
- Organization: dera
- Sender: owner-wri-mathgroup at wolfram.com
Dear All, I am trying to find a way of squirting data between Mathematica and an external process quicker than mathlink under Windows NT4 on a pc. My data is a simple greyscale image, typically it is just 700 by 300 and each pixel is 0-255, so a single byte per pixel would do. Even using the PackedArray format, one still needs two bytes per pixel. Storage is not really the issue here, doing lots of array access at the pixel level is still unusably slow (assume the problem cannot be reformulated to take advantage of fast internal functions like ListCovolve), so I thought I'd go for C/mathlink solution. Now, whether I squirt the image data down the mathlink pixel by pixel, ie doing MLGetInteger() for every pixel, or one big MLGetIntegerArray() it still takes about 3 seconds to transfer an image to or from the mathlink process. But....I observe that very large complicated display cells can be copied very quickly to and from the clipboard from the Mathematica frontend, so can we sidestep the slow mathlink? The Mathematica fragment that I would like is something like: --------------------------------------------------------------------- (* install my external C process *) mylink = Install["cprog.exe"]; (* invent an image *) data = ToPackedArray[Table[Random[Integer,{0,128}],{700},{200}]]; (* copy it to the clipboard somehow *) copyToClipboard[data]; (* call a function in the extenal C process to invert the image and assume that it is pasted to the clipboard *) myInvert[]; (* grab the result from the clipboard *) result = pasteFromClipboard[]; --------------------------------------------------------------------- The important part of the cprog.tm used to build cprog.exe might look something like: :Begin: :Function: myinvert :Pattern: myInvert[ ] :Arguments: { } :ArgumentTypes: { } :ReturnType: Manual :End: void myinvert() { int i,j,nr,nc; char *data; (1) openclipboard() (2) check format of data (eg image size nr rows by nc columns) (3) malloc storage (4) read the data from the clip board for (i=0; i<nr; i++) for (j=0; j<nc; j++) data[i*nc+j] = read a pixel; (5) delete the data from the clipbaord (6) do some manipulation for (i=0; i<nr; i++) for (j=0; j<nc; j++) data[i*nc+j] = 255-data[i*nc+j]; (7) put it back to the clipboard (8) closeclipboard (9) free malloced memory return; } Apart from (3), (6) and (9), any ideas on the other steps would be welcome. - Simon Shannon