1

MemoryStreamに変換するのに少し苦労していBitmapImageます。似たような状況で質問が多いのですが、いろいろSO試してみたところ解決できなかったので、お世話になりました。私がMagick.NET(ImageMagick.NET) を使用していることに注意してくださいTessnet2。これがそのコードの一部です。

私はBitmapクラスを使用して、Magick.NET と Tessnet2 でほとんどの作業を行います。 BitmapImage表示目的で使用されます。

まず、PDF を読み込み、最初のページからトリミングされたビットマップを抽出します。

public Task PdfToBmp(string path)
{
    return Task.Run(() =>
    {
        using (var image = new MagickImage())
        {
            MagickNET.SetGhostscriptDirectory("./");

            var settings = new MagickReadSettings
            {
                Density = new MagickGeometry(300, 300),
                FrameCount = 1
            };

            image.Read(path, settings);
            image.Crop(new MagickGeometry(1850, 200, 600, 140));

            // ImageStream is a MemoryStream property.
            ImageStream = new MemoryStream();
            image.Write(ImageStream, MagickFormat.Bmp);
            ImageStream.Position = 0;
        }
    });
}

それは、ビットマップを .csv ファイルに保存するときMemoryStreamです。ロードしたらMemoryStream、作業に移ります。をインスタンス化して、関連する作業にBitmap使用できるようにしてから、インスタンス化を試みます。Tessnet2BitmapImage

public Task DoOcr()
{
    if (ImageStream == null)
    {
        return null;
    }

    TargetImage = new Bitmap(ImageStream);
    ImageStream.Position = 0;

    // ----------------------- Problem Area ----------------------- //
    DisplayImage = new BitmapImage();
    DisplayImage.BeginInit();
    DisplayImage.StreamSource = ImageStream;
    DisplayImage.CacheOption = BitmapCacheOption.OnLoad;
    DisplayImage.EndInit();

    //ImageStream.Close();
    // ------------------------------------------------------------ //

    return Task.Run(() =>
    {
        var ocr = new Tesseract();
        ocr.Init("tessdata", "eng", false);
        var results = ocr.DoOCR(TargetImage, Rectangle.Empty);
        Dispatcher.Invoke(() =>
        {
            Results = new ObservableCollection<Word>(results);
        });
    });
}

これは私が問題を抱えているところです。そのブロックがなければDisplayImage、プログラムは正常に実行され、表示された画像が表示されません。Bitmap( TargetImage) を問題なくファイルに保存することもできます。ただし、DisplayImageブロックを使用すると、次のようになりますSystem.NullReferenceException

System.NullReferenceException occurred
_HResult=-2147467261
_message=Object reference not set to an instance of an object.
HResult=-2147467261
IsTransient=false
Message=Object reference not set to an instance of an object.
Source=System
StackTrace:
     at System.Uri.CreateThisFromUri(Uri otherUri)
InnerException: 

ImageStream検査するとオブジェクトが「きれい」に見えるため、正確に発生する場所を特定することはできません。StreamSourceこれにはデータが含まれており、位置は 0 です。 toとして割り当てた後、それを閉じようとするか、何かを実行しようとすると、そのようなアクションを実行しようとする行で例外が発生しますDisplayImagenullそれが問題かどうかを確認するために、2 つの異なるストリームを作成してみました。ただし、まったく同じ動作をしていました。特定の行を指していないことを考えると、これをデバッグするのはちょっと面倒です。MemoryStreamこれとの間には明らかに問題がありBitmapImageます。この特定の状況では、2つの間MemoryStreamに何らかのフォーマット/変換の問題がある可能性はありますか?Bitmap

ファイル ルートを試してみました。ファイルに保存してからMagickImageロードしたところ、問題なく動作しました。ただし、これをメモリ内で実行できるようにしたいと考えています。ちなみに、MemoryStream に position を設定しても、 (適切にロードされる) または(同じ例外)のいずれにも影響を与えないようです。BitmapImageUri0BitmapBitmapImage

私が現在使用している一時的な修正は、 ではなくを作成DisplayImageすることです。BitmapSourceBitmapImage

DisplayImage = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
    TargetImage.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
    BitmapSizeOptions.FromWidthAndHeight(TargetImage.Width, TargetImage.Height));
4

1 に答える 1