C# 如何保存位图
在WPF中,我有一个来自处理我的网络摄像头的库的位图C# 如何保存位图,c#,winforms,bitmap,save,C#,Winforms,Bitmap,Save,在WPF中,我有一个来自处理我的网络摄像头的库的位图 Bitmap bmp = webCameraControl.GetCurrentImage(); 现在我必须保存它,但是bmp.save(“C:/img.jpg”);失败 所以我试过了 bmp.Save("C:/img.jpg", ImageFormat.Jpeg); 但它不起作用,而且变得很糟糕 “通用GDI+错误” 谢谢 ---加--- 所以如果我把 bmp.Save("C:\\img.jpg", ImageFormat.Jpeg);
Bitmap bmp = webCameraControl.GetCurrentImage();
现在我必须保存它,但是bmp.save(“C:/img.jpg”);失败
所以我试过了
bmp.Save("C:/img.jpg", ImageFormat.Jpeg);
但它不起作用,而且变得很糟糕
“通用GDI+错误”
谢谢
---加---
所以如果我把
bmp.Save("C:\\img.jpg", ImageFormat.Jpeg);
bmp.Save(@"C:\img.jpg", ImageFormat.Jpeg);
我犯了一个错误。
但是如果我把
bmp.Save("img.jpg", ImageFormat.Jpeg);
真管用!!我不明白 我猜您的问题在于保存路径中的“/”。您可以使用以下两种方式之一编写:
bmp.Save(“C:\\img.jpg”,ImageFormat.Jpeg)//两个反斜杠转义为一个反斜杠
bmp.Save(@“C:\img.jpg”,ImageFormat.Jpeg)//添加@将自动转义反斜杠
编辑,您可能可以使用C:\
来四处走动。使用路径“%HomeDrive%\\img.jpg”
,这是C
驱动器的内置路径快捷方式。我不知道这在C#上的工作有多可靠,但上次我试过它时它工作了,现在在文件资源管理器中测试时它工作了
不过,对该目录的写入权限似乎是您最可能遇到的问题。如果是这样的话,我不知道该怎么办。我猜您的问题在于保存路径中的“/”。您可以使用以下两种方式之一编写:
bmp.Save(“C:\\img.jpg”,ImageFormat.Jpeg)//两个反斜杠转义为一个反斜杠
bmp.Save(@“C:\img.jpg”,ImageFormat.Jpeg)//添加@将自动转义反斜杠
编辑,您可能可以使用C:\
来四处走动。使用路径“%HomeDrive%\\img.jpg”
,这是C
驱动器的内置路径快捷方式。我不知道这在C#上的工作有多可靠,但上次我试过它时它工作了,现在在文件资源管理器中测试时它工作了
不过,对该目录的写入权限似乎是您最可能遇到的问题。如果是这样的话,我不知道该怎么办。“通用GDI+错误”。如果要存储它的目录的路径不存在,则通常会发生这种情况
- 检查路径是否存在
- 检查路径是否为vallid
bmp.Save(“C:\\Test\\img.jpg”,ImageFormat.Jpeg)代码>
确保使用\
或@“C:\Test\img.jpg”
如果这一切都不起作用,您可能无权保存到C:\\
“通用GDI+错误”。如果要存储它的目录的路径不存在,则通常会发生这种情况
- 检查路径是否存在
- 检查路径是否为vallid
bmp.Save(“C:\\Test\\img.jpg”,ImageFormat.Jpeg)代码>
确保使用\
或@“C:\Test\img.jpg”
如果这一切都不起作用,您可能无权保存到C:\\
以下是我的做法:
public static void RotateAndSaveImage(string path, WriteableBitmap bitmap, double angle)
{
try
{
if (bitmap != null)
{
var tb = new TransformedBitmap((bitmap), new RotateTransform(angle));
var src = tb as BitmapSource;
using (FileStream stream = new FileStream(path, FileMode.Create))
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(src));
encoder.Save(stream);
}
}
} catch {}
}
我是这样做的:
public static void RotateAndSaveImage(string path, WriteableBitmap bitmap, double angle)
{
try
{
if (bitmap != null)
{
var tb = new TransformedBitmap((bitmap), new RotateTransform(angle));
var src = tb as BitmapSource;
using (FileStream stream = new FileStream(path, FileMode.Create))
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(src));
encoder.Save(stream);
}
}
} catch {}
}
您是否尝试将图像保存到其他位置?
我猜这个目录是由windows本身保护的
解决方案:
在解决方案资源管理器上的项目文件上单击鼠标右键,选择“添加”,然后选择“新建项”。在那里可以找到应用程序清单文件
它创建名为app.manifest的文件。打开它并找到标签requestedPrivileges。(如下图所示)
您是否尝试将图像保存到其他位置?
我猜这个目录是由windows本身保护的
解决方案:
在解决方案资源管理器上的项目文件上单击鼠标右键,选择“添加”,然后选择“新建项”。在那里可以找到应用程序清单文件
它创建名为app.manifest的文件。打开它并找到标签requestedPrivileges。(如下图所示)
您还可以执行以下操作:
private void RotateAndSaveImage(int pageNumber, double angleOfRotation)
{
EnsureNotDisposed();
// create the encoder
BitmapEncoder encoder = BitmapEncoder.Create(Decoder.CodecInfo.ContainerFormat);
// copy the destination frames
foreach (BitmapFrame frame in Decoder.Frames)
encoder.Frames.Add(frame);
BitmapFrame oldFrame = encoder.Frames[pageNumber - 1];
// Create the TransformedBitmap to use as the Image source.
TransformedBitmap tb = new TransformedBitmap();
// Properties must be set between BeginInit and EndInit calls.
tb.BeginInit();
tb.Source = new CachedBitmap(oldFrame, BitmapCreateOptions.None, BitmapCacheOption.None);
RotateTransform transform = new RotateTransform(angleOfRotation);
tb.Transform = transform;
tb.EndInit();
encoder.Frames.RemoveAt(pageNumber - 1);
encoder.Frames.Insert(pageNumber - 1, BitmapFrame.Create(tb));
// save encoder
Save(encoder)
}
/// <summary>
/// Saves the contents of a bitmap encoder to <see cref="Stream"/>.
/// </summary>
/// <param name="encoder">
/// The encoder from which to obtain the data to save.
/// </param>
private void Save(BitmapEncoder encoder)
{
// save to a temporary stream
string tempFileName = Path.GetTempFileName();
try
{
using (FileStream temporaryStream = new FileStream(tempFileName, FileMode.OpenOrCreate))
{
if (encoder.Frames.Count > 0)
encoder.Save(temporaryStream);
// write back out to permanent stream
if (Stream.CanWrite && Stream.CanSeek)
CopyStream(temporaryStream, Stream);
else
throw new UnauthorizedAccessException();
}
}
finally
{
// Delete the temporary file
File.Delete(tempFileName);
}
}
private void RotateAndSaveImage(整数页码,双旋转角)
{
确保已停止();
//创建编码器
BitmapEncoder编码器=BitmapEncoder.Create(Decoder.CodecInfo.ContainerFormat);
//复制目标帧
foreach(解码器中的位图帧。帧)
编码器。帧。添加(帧);
BitmapFrame oldFrame=编码器.Frames[页码-1];
//创建转换位图以用作图像源。
TransformedBitmap tb=新的TransformedBitmap();
//必须在BeginInit和EndInit调用之间设置属性。
tb.BeginInit();
tb.Source=new CachedBitmap(oldFrame,BitmapCreateOptions.None,BitmapCacheOption.None);
旋转变换=新的旋转变换(旋转角度);
tb.Transform=转换;
tb.EndInit();
编码器。帧。移除(页码-1);
encoder.Frames.Insert(页码-1,BitmapFrame.Create(tb));
//保存编码器
保存(编码器)
}
///
///将位图编码器的内容保存到。
///
///
///从中获取要保存的数据的编码器。
///
私有无效保存(位图编码器)
{
//保存到临时流
字符串tempFileName=Path.GetTempFileName();
尝试
{
使用(FileStream temporaryStream=newfilestream(tempFileName,FileMode.OpenOrCreate))
{
如果(编码器.Frames.Count>0)
编码器。保存(临时流);
//写回永久流
if(Stream.CanWrite&&Stream.CanSeek)
CopyStream(临时流,流);
其他的
抛出新的UnauthorizedAccessException();
}
}
最后
{
//删除临时文件
删除(tempFileName);
}
}
您还可以执行以下操作:
private void RotateAndSaveImage(int pageNumber, double angleOfRotation)
{
EnsureNotDisposed();
// create the encoder
BitmapEncoder encoder = BitmapEncoder.Create(Decoder.CodecInfo.ContainerFormat);
// copy the destination frames
foreach (BitmapFrame frame in Decoder.Frames)
encoder.Frames.Add(frame);
BitmapFrame oldFrame = encoder.Frames[pageNumber - 1];
// Create the TransformedBitmap to use as the Image source.
TransformedBitmap tb = new TransformedBitmap();
// Properties must be set between BeginInit and EndInit calls.
tb.BeginInit();
tb.Source = new CachedBitmap(oldFrame, BitmapCreateOptions.None, BitmapCacheOption.None);
RotateTransform transform = new RotateTransform(angleOfRotation);
tb.Transform = transform;
tb.EndInit();
encoder.Frames.RemoveAt(pageNumber - 1);
encoder.Frames.Insert(pageNumber - 1, BitmapFrame.Create(tb));
// save encoder
Save(encoder)
}
/// <summary>
/// Saves the contents of a bitmap encoder to <see cref="Stream"/>.
/// </summary>
/// <param name="encoder">
/// The encoder from which to obtain the data to save.
/// </param>
private void Save(BitmapEncoder encoder)
{
// save to a temporary stream
string tempFileName = Path.GetTempFileName();
try
{
using (FileStream temporaryStream = new FileStream(tempFileName, FileMode.OpenOrCreate))
{
if (encoder.Frames.Count > 0)
encoder.Save(temporaryStream);
// write back out to permanent stream
if (Stream.CanWrite && Stream.CanSeek)
CopyStream(temporaryStream, Stream);
else
throw new UnauthorizedAccessException();
}
}
finally
{
// Delete the temporary file
File.Delete(tempFileName);
}
}
private void RotateAndSaveImage(整数页码,双旋转角)
{
确保已停止();
//创建编码器
BitmapEncoder编码器=BitmapEncoder.Create(Decoder.CodecInfo.ContainerFormat);
//复制目标帧
foreach(解码器中的位图帧。帧)
编码器。帧。添加(帧);
BitmapFrame oldFrame=编码器.Frames[页码-1];
private void RotateAndSaveImage(int pageNumber, double angleOfRotation)
{
EnsureNotDisposed();
// create the encoder
BitmapEncoder encoder = BitmapEncoder.Create(Decoder.CodecInfo.ContainerFormat);
// copy the destination frames
foreach (BitmapFrame frame in Decoder.Frames)
encoder.Frames.Add(frame);
BitmapFrame oldFrame = encoder.Frames[pageNumber - 1];
// Create the TransformedBitmap to use as the Image source.
TransformedBitmap tb = new TransformedBitmap();
// Properties must be set between BeginInit and EndInit calls.
tb.BeginInit();
tb.Source = new CachedBitmap(oldFrame, BitmapCreateOptions.None, BitmapCacheOption.None);
RotateTransform transform = new RotateTransform(angleOfRotation);
tb.Transform = transform;
tb.EndInit();
encoder.Frames.RemoveAt(pageNumber - 1);
encoder.Frames.Insert(pageNumber - 1, BitmapFrame.Create(tb));
// save encoder
Save(encoder)
}
/// <summary>
/// Saves the contents of a bitmap encoder to <see cref="Stream"/>.
/// </summary>
/// <param name="encoder">
/// The encoder from which to obtain the data to save.
/// </param>
private void Save(BitmapEncoder encoder)
{
// save to a temporary stream
string tempFileName = Path.GetTempFileName();
try
{
using (FileStream temporaryStream = new FileStream(tempFileName, FileMode.OpenOrCreate))
{
if (encoder.Frames.Count > 0)
encoder.Save(temporaryStream);
// write back out to permanent stream
if (Stream.CanWrite && Stream.CanSeek)
CopyStream(temporaryStream, Stream);
else
throw new UnauthorizedAccessException();
}
}
finally
{
// Delete the temporary file
File.Delete(tempFileName);
}
}
bitmap.Save(stream, ImageFormat.png);
return Convert.ToBase64String(stream.ToArray());