 <p>You could try an imaging library like ImageFX, or for an open-source one, try <a href="http://graphics32.org/wiki/" rel="nofollow">Graphics32</a>, or the <a href="http://imaginglib.sourceforge.net/index.php?page=down" rel="nofollow">VampyreImagingLIbrary</a>, according to its Docs <a href="http://galfar.vevb.net/imaging/doc/imaging.html" rel="nofollow">here</a> it supports some operations like drawing lines and rectangles over an image loaded into a buffer. I would expect scanner (image processing) libraries to support grey-scale images better than non-imaging libraries, but I don't expect scanner image processing libraries to be in-memory based. </p> <p>But if you wanted to do the work directly in a visible buffer (You mention TCanvas), and you you are willing to limit yourself to Delphi XE, and Windows 7 only, you could use a Direct2D context, which supports 16 and 32 bit depths but as a 32 bit color depth is still only going to be 8 bit depth with respect to a grayscale image, I think that all normal non-greyscale graphics libraries are going to lose some information on you.</p> <p>If you didn't mind using something a bit old, and a bit tied to Microsoft Windows, you could investigate using DirectDraw style (now merged into <a href="http://msdn.microsoft.com/en-us/directx/aa937781" rel="nofollow">DirectX</a>) both to do the Buffer management (hold the 16 bit data) and letting you draw onto it, as well. I am not aware of it having any special support for 16 bit grayscale images though.</p> <p>Interestingly, <a href="http://stackoverflow.com/questions/1105066/wpf-image-and-directx-surfaceformat">WPF</a> has support for 16 bit grayscale natively. If you could find out how they do it, you could ape the technique in Delphi. That link also discusses using OpenGL to do 16 bit luminance, but there's no suggestion from the question that OpenGL allows that. I have found people trying to use <a href="https://forums.codegear.com/message.jspa?messageID=226578" rel="nofollow">OpenGL</a> for medical applications written in delphi (16 bit grayscale) image display, but no reference to modifying the image in memory.</p>