Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/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#WPF_C#_Wpf_Canvas_Snapshot - Fatal编程技术网

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

具有小文件大小的画布快照-C#WPF,c#,wpf,canvas,snapshot,C#,Wpf,Canvas,Snapshot,我有一个益智游戏,我可以创造水平。当我保存一个关卡时,它会拍摄画布的快照,然后当我选择一个关卡时,它会将关卡名称旁边的所有图片显示为缩略图。但是,每个图像的大小约为1MB。我想让它们的大小达到30KB左右。此外,即使它是jpg,照片编辑器也无法编辑它生成的文件以使其变小。我知道我用了TiffBitmapEncoder哇。可能是我和照片编辑的问题 这是我的密码: private void saveImage(object sender, EventArgs e) { string path

我有一个益智游戏,我可以创造水平。当我保存一个关卡时,它会拍摄画布的快照,然后当我选择一个关卡时,它会将关卡名称旁边的所有图片显示为缩略图。但是,每个图像的大小约为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();
}

哦,天哪,你使用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);
  }
}

谢谢如何设置尺寸?96d?这张照片有300kb。我想再低一点。你是想从画布上裁剪,还是想调整输出图像的大小
96d
只是DPI(
d
将其指定为
double
值)。我希望输出图像与96d中的图像相同。我只是希望图像大小小于300kb以获得更好的性能,所以我想质量会差一点。但是下降到30d会使大部分图像变黑,因为图像的物理尺寸变小了。