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
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