2012-05-31 485 views
9

我希望在保存的圖像上具有更小的尺寸。 我該如何調整它的大小? 我用這個代碼redering圖像:調整位圖圖像的大小

Size size = new Size(surface.Width, surface.Height); 
surface.Measure(size); 
surface.Arrange(new Rect(size)); 
// Create a render bitmap and push the surface to it 
RenderTargetBitmap renderBitmap = 
    new RenderTargetBitmap(
     (int)size.Width, 
     (int)size.Height, 96d, 96d, 
     PixelFormats.Default); 
renderBitmap.Render(surface); 

BmpBitmapEncoder encoder = new BmpBitmapEncoder(); 
// push the rendered bitmap to it 
encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 
// save the data to the stream 
encoder.Save(outStream); 

回答

3

貴「面」的視覺已經縮放能力?如果沒有,您可以將其包裝在視圖框中,然後以您想要的大小渲染視圖框。

當你在表面上調用Measure和Arrange時,你應該提供你想要的位圖的大小。

要使用視框,你的代碼更改爲類似如下:

Viewbox viewbox = new Viewbox(); 
Size desiredSize = new Size(surface.Width/2, surface.Height/2); 

viewbox.Child = surface; 
viewbox.Measure(desiredSize); 
viewbox.Arrange(new Rect(desiredSize)); 

RenderTargetBitmap renderBitmap = 
    new RenderTargetBitmap(
    (int)desiredSize.Width, 
    (int)desiredSize.Height, 96d, 96d, 
    PixelFormats.Default); 
renderBitmap.Render(viewbox); 
30
public static Bitmap ResizeImage(Bitmap imgToResize, Size size) 
{ 
    try 
    { 
     Bitmap b = new Bitmap(size.Width, size.Height); 
     using (Graphics g = Graphics.FromImage((Image)b)) 
     { 
      g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      g.DrawImage(imgToResize, 0, 0, size.Width, size.Height); 
     } 
     return b; 
    } 
    catch 
    { 
     Console.WriteLine("Bitmap could not be resized"); 
     return imgToResize; 
    } 
} 
+1

沒有try-catch塊,這是完美的。 –

+0

尺寸部分很重要,我發現使用2個整數的多箇舊答案,但你現在需要一個尺寸。感謝您注意到,節省了一些麻煩。 (爲了讓未來的觀衆知道使用2個整數的答案,需要相應地改變) –

5

來調整位圖的最短的方法是將其與所需size(或width and height)一起傳遞給位圖的構造:

bitmap = new Bitmap(bitmap, width, height); 
+1

@Downvoter請解釋 – Breeze

+0

爲我工作。爲了彌補某人的不禮貌而積極投票。 – srking

+0

完美工作。 – theMohammedA