仅保存图像的顶部

时间:2014-02-16 01:00:07

标签: c# wpf-controls

我正在使用以下代码保存画布的图片

if (!Directory.Exists(DefaultSettings.MainPath + "//Skeleton Images//"))
    Directory.CreateDirectory(DefaultSettings.MainPath + "//Skeleton Images//");
System.Windows.Size size = new System.Windows.Size(canvas.Width, canvas.Height);
canvas.Measure(size);
canvas.Arrange(new System.Windows.Rect(size));
RenderTargetBitmap renderBitmap = new RenderTargetBitmap( (int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32);
renderBitmap.Render(canvas);
using (FileStream outstream = new FileStream(DefaultSettings.MainPath + "//Skeleton Images//Kinected (" + images + ").jpg", FileMode.Create))
{
    JpegBitmapEncoder cEncoder = new JpegBitmapEncoder();
    cEncoder.Frames.Add(BitmapFrame.Create(renderBitmap));
    cEncoder.Save(outstream);
}

但是,它只保存图像的顶部。虽然图像尺寸为321x240,但画布尺寸也相同。为什么会这样?保存整个画布之前使用的相同代码,为什么这会突然创建错误?下面的图片说明了问题。另请注意,画布位于图像顶部,因为它们是单独渲染的,并且画布一直向下延伸到“颜色框”文本。

Only top portion saved

2 个答案:

答案 0 :(得分:3)

  

虽然图像尺寸为321x240,但画布尺寸也相同

他们这样做,但他们不使用相同的单位。位图大小为像素,画布大小以1/96 英寸为单位。由于在许多相同数量的机器上,这往往工作得很好。但是,当您在具有不同每英寸点数设置的计算机上运行视频适配器时,则不会。更高版本的Windows使得更改它变得非常简单,预先选择的选项分别为125%和150%。就像你一样。

您必须以像素为单位创建更大的位图。已经被this question很好地覆盖了。

答案 1 :(得分:1)

尝试以这种方式查找尺寸:

private static Size SizeCalculation(Size image, Size boundingBox)
{       
    double widthScale = 0, heightScale = 0;
    if (image.Width != 0)
        widthScale = (double)boundingBox.Width / (double)image.Width;
    if (image.Height != 0)
        heightScale = (double)boundingBox.Height / (double)image.Height;                

    double scale = Math.Min(widthScale, heightScale);

    Size result = new Size((int)(image.Width * scale), 
                        (int)(image.Height * scale));
    return result;
}

查看您是否使用此代码获得了适当的大小,并且您的代码适用于图像以适应它。