如何正确处理内存驻留位图调整大小

时间:2016-05-05 07:21:58

标签: c# wpf bitmap resize

我的位图驻留在内存中(来自我的网络摄像头,但我不认为这会产生影响。 它是960x540 120dpi

enter image description here

你看到下半部分的图片一直到我的衬衫开始的地方。

我知道bmp尺寸因为我把这个代码放在调整大小之前

using (var fileStream = new FileStream(@"C:\temp\3.bmp", FileMode.Create))
{
    BitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(source));
    encoder.Save(fileStream);
}

结果如上图所示。

然后我用它调整大小:

var resizedImage = new RenderTargetBitmap(
                width, height,           // Resized dimensions 200x112
                source.DpiX, source.DpiY,// Default DPI values
                PixelFormats.Default);   // Default pixel format

,结果是下面的bmp正确为200x112,但是在下部和右部的部分图像中切出。

enter image description here

我已经看到问题与RenderTargetBitmap指令中的dpi值有关。如果我将dpi除以1.25,一切都会好起来,但为什么1.25 ???????

提前感谢您的帮助 帕特里克

- ADD -

还有一些我无法理解的内容:我知道我的初始位图大小已经按照上面的说明将其保存到filesytem。 但如果我通过设置断点来查看属性,我会看到:

BALMAP在调整之前

  

宽度,高度= 768,432

     

pixelwidth,pixelheight = 960,540

     

dpiX,dpiY = 120,120

BITMAP后调整

  

宽度,高度= 160,89

     

pixelwidth,pixelheight = 200,112

     

dpiX,dpiY = 120,120

现在我知道这里重要的是像素宽度,像素高度,这是正确的。

如果我做960/786,我得到1.25!这是我的号码,但为什么呢?我可以更正代码,使其成为一般解决方案吗?

1 个答案:

答案 0 :(得分:0)

您应该使用RenderTargetBitmap而不是TransformedBitmap而不是ScaleTransform

var scale = 200d / 960d;
var resizedImage = new TransformedBitmap(source, new ScaleTransform(scale, scale));