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); で例外を発生させます。(DisplayFile 関数)
それは次のとおりです。
System.Drawing.dll で、タイプ 'System.Rutime.InteropServices.ExternalException' の未処理の例外が発生しました
GDI+ で一般的なエラーが発生しました。
bmp 内の rawdata メンバー (非パブリック メンバー) が null であることに気付きました。ビットマップに渡された生データが元々アンマネージド データのマネージド ポインターであり、消失したためではないかと疑っています。でも、LockBitsは動かないようにするはずだと思っていました。