如何保存位图

时间:2016-09-13 15:52:06

标签: c# winforms bitmap save

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

那有效!!我无法理解!=?!?

6 个答案:

答案 0 :(得分:2)

“通用GDI +错误”。如果路径不存在于您要存储它的目录中,则通常会发生。

  • 检查路径是否存在
  • 检查路径是否为vallid

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