2

皆さん、画像をメディア ライブラリに保存するときに奇妙な問題に遭遇しました。私のアプリケーションは例外を発生させずにクラッシュしました。これが私の保存コードです。

using (MemoryStream stream = new MemoryStream())
{
    try
    {
        WriteableBitmap bitmap = new WriteableBitmap(InkPrest, InkPrest.RenderTransform); // Crash here, the actualHeight of InkPrest is 2370.0 

        bitmap.SaveJpeg(stream, (int)InkPrest.ActualWidth, (int)InkPrest.ActualHeight, 0, 100);
        stream.Seek(0, SeekOrigin.Begin);

        MediaLibrary library = new MediaLibrary();
        library.SavePicture(DateTime.Now.ToString(), stream.GetBuffer());
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

段階的にデバッグしましたが、アプリがクラッシュしました

WriteableBitmap bitmap = new WriteableBitmap(InkPrest, InkPrest.RenderTransform); // Crash here, the actualHeight of InkPrest is 2370.0

この問題を解決するためのアイデアはありますか?

============================================

複数の画像を保存してみる

uielement は 704 * 2370 です

TranslateTransform transform = new TranslateTransform();
transform.Transform(new Point(0,0));
double MaxHeight = 800;
double height = InkPrest.ActualHeight;
int saveCount = 0;
int succeedCount = 0;
while (height > 0)
{
    using (MemoryStream stream = new MemoryStream())
    {
        try
        {
            double actualRenderHeight = Math.Min(height, MaxHeight);
            WriteableBitmap bitmap = new WriteableBitmap((int)InkPrest.ActualWidth, (int)actualRenderHeight);

            bitmap.Render(InkPrest, transform); //Crash here, also no exception.
            bitmap.Invalidate();

            height -= actualRenderHeight;
            transform.Y -= actualRenderHeight;

            bitmap.SaveJpeg(stream, (int)InkPrest.ActualWidth, (int)actualRenderHeight, 0, 100);
            stream.Seek(0, SeekOrigin.Begin);

            MediaLibrary library = new MediaLibrary();
            Picture pic = library.SavePicture(manuscriptFile.Title + DateTime.Now.ToString(), stream.GetBuffer());
            saveCount++;
            if (pic != null)
            {
                succeedCount++;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}
4

1 に答える 1

0

uithread または他の作成されたスレッドで writeablebitmap をインスタンス化しているかどうかを確認してください。uithread で writeablebitmap を作成する必要があります。

于 2012-09-03T12:43:40.717 に答える