作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
之前我用win32的时候用的FreeImage为了加载和保存位深大于 8 位的位图。这是我处理的每张图像,因为我在做医学成像,在任何人说任何话之前,是的,我和我的客户已经在具有 11 位或 12 位动态范围的高亮度、高对比度显示器上花了很多钱.事实上,如果你好奇,requirements by the ACR for running mammography包括至少具有 10 位动态范围的监视器。
我刚刚切换到 x64 以解决内存开销,并将我的所有开发工作转移到一个平台和编译模式上。我宁愿不回到 win32,而且我的客户就在我身边(并且确实迫使我做出改变)。 FreeImage 不能在 64 位窗口上编译;它在编译器无法处理的代码中有一个 _asm 指令。
我想我会在 Microsoft 类中尝试原生 .NET 支持。长话短说:它们不起作用,并且失败并显示非常有限的错误消息。我怀疑这是因为 Microsoft 仍然不支持 Format16bppGrayScale 类。
也许我的代码有问题。这是我的编写代码:
Bitmap theBitmap = new Bitmap(inImage.XSize, inImage.YSize, PixelFormat.Format16bppGrayScale);
//have to go with lockbits
Rectangle rect = new Rectangle(0, 0, theBitmap.Width, theBitmap.Height);
System.Drawing.Imaging.BitmapData bmpData =
theBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
PixelFormat.Format16bppGrayScale);
IntPtr ptr = bmpData.Scan0;
int theByteSize = theBitmap.Width * theBitmap.Height *2;
byte[] theByteBuffer = new byte[theByteSize];
System.Buffer.BlockCopy(inImage.Data, 0, theByteBuffer, 0, theByteSize);
System.Runtime.InteropServices.Marshal.Copy(theByteBuffer, 0, ptr, theByteSize);
theBitmap.UnlockBits(bmpData);
theBitmap.Save(inDirectory + "\\" + inName);
theBitmap.Dispose();
An unhandled exception of type
'System.Runtime.InteropServices.ExternalException' occurred in
System.Drawing.dll
Additional information: A generic error occurred in GDI+.
Bitmap theBitmap = new Bitmap(theCompleteName, false);
ushort[] theData = new ushort[theBitmap.Width * theBitmap.Height];
int x, y;
switch (theBitmap.PixelFormat)
{
case PixelFormat.Format16bppGrayScale:
//have to go with lockbits
{
Rectangle rect = new Rectangle(0, 0, theBitmap.Width, theBitmap.Height);
System.Drawing.Imaging.BitmapData bmpData =
theBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly,
PixelFormat.Format16bppGrayScale);
IntPtr ptr = bmpData.Scan0;//scanline approach left over from FreeImage
for (y = 0; y < theBitmap.Height; ++y){
byte[] scanline = new byte[theBitmap.Width*2];
System.Runtime.InteropServices.Marshal.Copy(ptr, scanline, y * theBitmap.Width * 2, theBitmap.Width * 2);
System.Buffer.BlockCopy(scanline, 0, theData, y * theBitmap.Width * 2, theBitmap.Width * 2);
}
theBitmap.UnlockBits(bmpData);
}
break;
//for colors, just take the red and call it a day
case PixelFormat.Format24bppRgb:
case PixelFormat.Format32bppArgb://really stupid reading code, always works
for (y = 0; y < theBitmap.Height; ++y) {
for (x = 0; x < theBitmap.Width; ++x) {
theData[y * theBitmap.Width + x] = (byte)(theBitmap.GetPixel(x, y).R);
}
}
break;
}
theNewImage = new ImageContainer(theData, theBitmap.Width, theBitmap.Height, inName, inAssessmentID);
theBitmap.Dispose();//not needed, anymore
An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll
Additional information: Parameter is not valid.
最佳答案
FreeImage 可以编译为 x64。按照说明操作 here你可以绕过_asm
指令。页面底部还有一个已编译的 64 位 dll。
最新版本 (3.15.1) 已包含此修复程序。我选择了源代码发行版进行尝试(我很好奇在我自己的项目中使用 FreeImage)并且 x64 平台立即编译正常。
关于.net - 如何在 .net x64 中保存/加载 16 位图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2294570/
我是一名优秀的程序员,十分优秀!