Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何保存位图_C#_Winforms_Bitmap_Save - Fatal编程技术网

C# 如何保存位图

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

在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);
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());