vs 2013 c# 从直接流中保存位图

vs 2013 c# save bitmap from direct stream

void CaptureTimer_Tick(object sender, EventArgs e)
    {
        CaptureTimer.Stop();
        Bitmap bitmapImage = new Bitmap((int)this.ActualWidth, (int)this.ActualHeight);
        Graphics gr1 = Graphics.FromImage(bitmapImage);
        IntPtr dc1 = gr1.GetHdc();
        IntPtr dc2 = NativeMethods.GetWindowDC(NativeMethods.GetForegroundWindow());
        NativeMethods.BitBlt(dc1, (int)20, (int)20, (int)this.ActualWidth, (int)this.ActualHeight, dc2, 20, 20, 13369376);
        gr1.ReleaseHdc(dc1);
        Random rnd = new Random();
        bitmapImage.Save(string.Format(".\Captures\Capture{0}.jpg", rnd.Next().ToString()), ImageFormat.Jpeg);

        PlaySoundOnButton(ButtonTypes.CaptureBtn);
        CommandManager.InvalidateRequerySuggested();
    }

crash

那是导致程序崩溃的部分代码。 或者我需要把整个代码? 不好意思这个小时打扰你们了。

您的代码可能存在一些问题:

a) 您没有对某些变量调用 Dispose(或使用 using 以便为您完成)。 bitmapImage 就是这样一个例子。

b) 您使用“.\Captures...”保存文件是有问题的,因为它依赖于 Current Directory。例如,如果当前目录更改为 Windows 目录(您的程序可能缺少写入文件的权限),这可能会出现问题。

c) Random rnd = new Random(); 可能会导致多次生成相同的文件名(尤其是快速连续调用时)——这可能意味着旧的屏幕截图会丢失/被覆盖。

{
        string path = @"f:\temp\MyTest.tif";
        FileStream fs = new FileStream(path, FileMode.Create);
        RenderTargetBitmap bmp = new RenderTargetBitmap((int)workspace.ActualWidth,
            (int)workspace.ActualHeight, 1 / 96, 1 / 96, PixelFormats.Pbgra32);
        bmp.Render(workspace);
        BitmapEncoder encoder = new TiffBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bmp));
        encoder.Save(fs);
        fs.Close();
    }

谢谢你给我的建议@mjwills @SLaks @juharr @Aleks Andreev