我的位图驻留在内存中(来自我的网络摄像头,但我不认为这会产生影响。 它是960x540 120dpi
你看到下半部分的图片一直到我的衬衫开始的地方。
我知道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,但是在下部和右部的部分图像中切出。
我已经看到问题与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!这是我的号码,但为什么呢?我可以更正代码,使其成为一般解决方案吗?
答案 0 :(得分:0)
您应该使用RenderTargetBitmap
而不是TransformedBitmap
而不是ScaleTransform
:
var scale = 200d / 960d;
var resizedImage = new TransformedBitmap(source, new ScaleTransform(scale, scale));