调整位图大小以提高图像质量

时间:2015-09-13 19:18:13

标签: c# wpf image

我有一个应用程序可以获取并保存打开窗口的图片。不幸的是,当图像和窗口的尺寸匹配时,图像质量低得令人无法接受。我已经增加了RenderTargetBitmap的大小,这增加了图像质量,但是,现在生成的图像的尺寸对我来说太大了。

我的问题是:有没有办法将生成的RenderTargetBitmap调整为窗口的原始尺寸?是否可以在没有相应的图像质量损失的情况下做到这一点?这是我现在的代码。

List<Character> chars = new ArrayList<Character>();
    for (int i = 0; i < toCompress.length(); i++) {
        chars.add(toCompress.charAt(i));
    }
    List<String> bits = new ArrayList<String>();
    for (int i = 0; i < chars.size(); i++) {
        char toMatch = chars.get(i);
        int matching = 1;
        for (int dontuse = i; dontuse < chars.size(); dontuse++) {
            int x = dontuse + 1;
            if (x >= chars.size()) {
                continue;
            }
            if (chars.get(x) == toMatch && (x - 1 == matching)) {
                matching++;
            }
        }
        if (!bits.contains(toMatch + "" + matching)) {
            bits.add(toMatch + "" + (matching + 1));
            i = i + matching;
        }
    }
    String compressed = "";
    for (int y = 0; y < bits.size(); y++) {
        if (y == (bits.size() - 1)) {
            compressed += bits.get(y);
        } else {
            compressed += bits.get(y) + "-";
        }
    }
    return compressed;

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

要调整大小,您可以执行以下操作:

var resized = new TransformedBitmap(bmp,
    new ScaleTransform(newWidth / bmp.PixelWidth, newHeight / bmp.PixelHeight));

您还可以尝试缩放尺寸和dpi,如下所示:

public static RenderTargetBitmap RenderBitmap(FrameworkElement visualToRender, double scale) {
        RenderTargetBitmap bmp = new RenderTargetBitmap
            (
            (int) (scale*(visualToRender.ActualWidth + 1)),
            (int) (scale*(visualToRender.ActualHeight + 1)),
            scale*96,
            scale*96,
            PixelFormats.Pbgra32
            );
        bmp.Render(visualToRender);
        return bmp;
    }

已更新以回答您的评论。所以我想你需要将结果保存在某个地方,可能是jpeg或png。 RenderTargetBitmap和TransformedBitmap都继承自BitmapSource,因此您可以像这样对图像进行编码:

var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
using (Stream s = File.Create("test.png")) {
    encoder.Save(s);
}

这里&#34; bmp&#34;可以是RenderTargetBitmap和TrasnformedBitmap