带有小文件大小的画布快照 - C#WPF

时间:2013-12-12 23:13:02

标签: c# wpf canvas snapshot

我有一个益智游戏,我可以创建关卡。当我保存一个级别时,它会拍摄画布的快照,然后当我选择一个级别时,它会将其名称旁边的级别的所有图片显示为缩略图。但是每个图像的大小约为1MB。我想让它们的大小约为30KB。此外,它所制作的文件无法通过照片编辑器进行编辑,以使其尺寸更小,即使它是jpg。我看到我使用过TiffBitmapEncoder。可能是我与照片编辑的问题。

这是我的代码:

private void saveImage(object sender, EventArgs e)
{
    string path = myImageNamePath;
    FileStream fs = new FileStream(path, FileMode.Create);
    RenderTargetBitmap bmp = new RenderTargetBitmap((int)myLevelDesigner.pbxMap.ActualWidth,
        (int)myLevelDesigner.pbxMap.ActualHeight, 1 / 96, 1 / 96, PixelFormats.Pbgra32);
    bmp.Render(myLevelDesigner.pbxMap);
    BitmapEncoder encoder = new TiffBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bmp));
    encoder.Save(fs);
    fs.Close();
}

1 个答案:

答案 0 :(得分:2)

哦,我的,你使用TIFF文件格式有什么特别的原因吗?我强烈建议使用PNG,它是无损和压缩的。

使用PngBitmapEncoder代替,大多数图形程序都支持PNG。

我还建议将其作为一种可以在整个过程中重复使用的扩展方法。像这样:

public static class CanvasExtender
{
  public static void SaveToImageFile(this Canvas canvas, string outputFile)
  {
    canvas.UpdateLayout();

    var bitmap = new RenderTargetBitmap(canvas.ActualWidth, canvas.ActualHeight, 96d, 96d, PixelFormats.Pbgra32);
    bitmap.Render(canvas);

    var encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bitmap));

    using(var outputStream = File.Create(outputFile))
      encoder.Save(outputStream);
  }
}