我的 c# WPF 应用程序中有一个函数,DisplayFile
用于填充System.Windows.Controls.Image
位图图像。此位图图像是从 fileName 提供的文件中加载的:
public void DisplayFile(System.Windows.Controls.Image imageBox, TextBlock textBox,
String fileName)
{
Bitmap bmp;
BitmapImage bitmapImage;
StringBuilder strBldr = new StringBuilder(_ObjFolderPath);
strBldr.Append(fileName);
ExtractBitmapAndDescriptor(strBldr.ToString(), out newtext, out bmp);
using (MemoryStream memory = new MemoryStream())
{
bmp.Save(memory, ImageFormat.Bmp);
memory.Position = 0;
bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
}
imageBox.Source = bitmapImage;
textBox.Text = newtext;
}
ExtractBitmapAndDescriptor
是用 C++/CLI 库编写的函数,用于读取给定文件并将 Bitmap 对象吐回 c# 函数:
void ExtractBitmapAndDescriptor(String ^filePath,[Out] String ^%descriptor,[Out] Bitmap^% bmpIn)
{
//... Seek through file until Bitmap information reached (File
// has an embedded bitmap file
//inside with no color pallette and was created using a c++ application)
// reached bitmap Data
BITMAPFILEHEADER bfh;
BITMAPINFO bi;
fread(&bfh, sizeof(BITMAPFILEHEADER), 1, in);
fread(&bi, sizeof(BITMAPINFO)- sizeof(tagRGBQUAD), 1, in);
BYTE* imageData = (BYTE*) malloc( bi.bmiHeader.biSizeImage );
ZeroMemory(imageData, bi.bmiHeader.biSizeImage);
fread(imageData, bi.bmiHeader.biSizeImage,1, in);
bmpIn = gcnew Bitmap((int)bi.bmiHeader.biWidth, (int)bi.bmiHeader.biHeight, (int)bi.bmiHeader.biWidth*3, PixelFormat::Format24bppRgb,IntPtr( ( void * ) imageData ));
System::Drawing::Rectangle newRect(0,0,bi.bmiHeader.biWidth, bi.bmiHeader.biHeight);
bmpIn->LockBits(newRect, Imaging::ImageLockMode::ReadOnly,PixelFormat::Format24bppRgb);
// Parse Other Data and return
}
该代码在 bmp.Save(memory, ImageFormat.Bmp); 处给出了一个异常;(显示文件功能)
内容如下:
System.Drawing.dll 中出现“System.Rutime.InteropServices.ExternalException”类型的未处理异常
GDI+ 中出现一般错误。
我注意到 bmp 中的 rawdata 成员(非公共成员)为空。我怀疑这是因为传递到位图中的原始数据最初是非托管数据上的托管指针而消失了。不过,我认为 LockBits 应该确保它不会移动。