2014-02-16 47 views
2

我用下面的代碼保存畫布的圖片只有頂部被保存

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

回答

3

雖然圖像大小爲321x240,並且畫布大小也是同樣的大小

他們這樣做,但他們不使用相同的單位。位圖尺寸爲像素,畫布尺寸單位爲1/96英寸英寸。由於許多機器的數量相同,因此這種方式很好地工作。但是,當您在具有不同的每英寸點數設置的計算機上運行視頻適配器時,則不會。更新版本的Windows可以非常簡單地進行更改,預先選擇125%和150%的選擇。像你一樣。

你必須創建一個更大的位圖像素。已由this question覆蓋。

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; 
} 

看看你是否得到適當的尺寸與此代碼,你的代碼工作的形象,以適應進去。