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
使用できるようにしてから、インスタンス化を試みます。Tessnet2
BitmapImage
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として割り当てた後、それを閉じようとするか、何かを実行しようとすると、そのようなアクションを実行しようとする行で例外が発生しますDisplayImage
。null
それが問題かどうかを確認するために、2 つの異なるストリームを作成してみました。ただし、まったく同じ動作をしていました。特定の行を指していないことを考えると、これをデバッグするのはちょっと面倒です。MemoryStream
これとの間には明らかに問題がありBitmapImage
ます。この特定の状況では、2つの間MemoryStream
に何らかのフォーマット/変換の問題がある可能性はありますか?Bitmap
ファイル ルートを試してみました。ファイルに保存してからMagickImage
ロードしたところ、問題なく動作しました。ただし、これをメモリ内で実行できるようにしたいと考えています。ちなみに、MemoryStream に position を設定しても、 (適切にロードされる) または(同じ例外)のいずれにも影響を与えないようです。BitmapImage
Uri
0
Bitmap
BitmapImage
私が現在使用している一時的な修正は、 ではなくを作成DisplayImage
することです。BitmapSource
BitmapImage
DisplayImage = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
TargetImage.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
BitmapSizeOptions.FromWidthAndHeight(TargetImage.Width, TargetImage.Height));