0

C# WPF アプリケーションDisplayFileSystem.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;

    }

ExtractBitmapAndDescriptorC++/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は動かないようにするはずだと思っていました。

4

0 に答える 0