在WPF中,我有一个来自图书馆的Bitmap来处理我的网络摄像头
Bitmap bmp = webCameraControl.GetCurrentImage();
现在我必须保存它,但是bmp.Save(“C:/img.jpg”);失败 所以我试过
bmp.Save("C:/img.jpg", ImageFormat.Jpeg);
但它无法正常工作
“通用GDI +错误”。
谢谢
--- --- ADD
所以,如果我把
bmp.Save("C:\\img.jpg", ImageFormat.Jpeg);
bmp.Save(@"C:\img.jpg", ImageFormat.Jpeg);
我收到错误。 但是,如果我把
bmp.Save("img.jpg", ImageFormat.Jpeg);
那有效!!我无法理解!=?!?
答案 0 :(得分:2)
“通用GDI +错误”。如果路径不存在于您要存储它的目录中,则通常会发生。
bmp.Save("C:\\Test\\img.jpg", ImageFormat.Jpeg);
确保使用\\
或@"C:\Test\img.jpg"
如果这一切都无效,您可能无权保存到C:\\
答案 1 :(得分:1)
我猜你的问题是保存路径中的“/”。你可以用以下两种方式之一来写它:
bmp.Save("C:\\img.jpg", ImageFormat.Jpeg); //two backslashes escapes to a single backslash
bmp.Save(@"C:\img.jpg", ImageFormat.Jpeg); //adding @ escapes the backslash automatically
修改 I found this over at Super User,您可以使用此C:\
来解决问题。使用路径"%HomeDrive%\\img.jpg"
,它是C
驱动器的内置路径快捷方式。我不知道这对C#有多可靠,但是上次我尝试它时起作用,当我在文件资源管理器中测试时,它可以工作。
对该目录的写权限似乎是最可能的问题。如果是这种情况,我不知道可以做些什么。
答案 2 :(得分:1)
您是否尝试过另一个位置来保存图像? 我猜这个目录受到windows本身的保护。
<强>解决方案:强>
右键单击解决方案资源管理器中的项目文件,选择“添加”,然后选择“新建项”。在那里你可以找到Application Manifest File。
它会创建名为 app.manifest 的文件。打开它,找到 requestedPrivileges 标签。 (如下图所示)
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- ##GERMAN TEXT##
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" /> ##GERMAN TEXT##
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
您感兴趣的是这一行:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
你执行它作为调用者(&#34; asInvoker&#34;)。 将其更改为&#34; requireAdministrator&#34;并以管理员身份重新启动VisualStudio。
这应该成为:)
我忘了提到我用这两行代码试了一下。 当我以管理员身份运行它时,它适用于我。
Bitmap bmp = new Bitmap(12,12);
bmp.Save("C:/img.jpg", ImageFormat.Jpeg);
答案 3 :(得分:0)
我是这样做的:
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 {}
}
答案 4 :(得分:0)
您也可以像下面这样:
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);
}
}
答案 5 :(得分:0)
您可以将位图保存到流中,然后将其转换为 base64String。一旦你有了这个,你想用它做什么。
bitmap.Save(stream, ImageFormat.png);
return Convert.ToBase64String(stream.ToArray());