2013-04-03 38 views
5

我有一個圖像,我想重新調整大小,需要保存在我的臨時文件夾中。在WPF中調整圖像

我曾嘗試是如下:

UIElement uie = CanvasHost.Child; 
int width = 800; 
int height = (int)((width/(double)((FrameworkElement)uie).Width) * (int)((FrameworkElement)uie).Height);   
RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32); 
rtb.Render(uie); 

string dir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\temp\"; 
if (!Directory.Exists(dir)) 
     Directory.CreateDirectory(dir); 

long size = 0; 

string filePath = dir + DateTime.Now.Ticks.ToString() + (isPng ? ".png" : ".jpg"); 
BitmapEncoder enc = null; 

using (FileStream fs = File.Create(filePath)) 
{ 
    if (isPng) 
     enc = new PngBitmapEncoder(); 
    else 
     enc = new JpegBitmapEncoder(); 

    enc.Frames.Add(BitmapFrame.Create(rtb)); 
    enc.Save(fs); 

    size = fs.Length; 
} 

但是當我這樣創建的圖像將其保存在臨時文件夾中的圖像的一部分。 (如圖所示在上述PIC)

enter image description here

我怎樣才能重新大小完整的圖像?我在這裏錯過了什麼?

編輯: 如通過ERTI-克里斯Eelmaa提到我已經改變的代碼,如下在上述答案如所提到的。和它的作品......

UIElement uie = CanvasHost.Child; 
int width = DataCache.Instance.CurrentProject.MaxPhotoEdgeSize; 
int height = (int)((width/(double)((FrameworkElement)uie).Width) * (int)((FrameworkElement)uie).Height); 

RenderTargetBitmap rtb = new RenderTargetBitmap((int)((FrameworkElement)uie).Width, (int)((FrameworkElement)uie).Height, 96, 96, PixelFormats.Pbgra32); 
rtb.Render(uie); 

ImageSource im = (ImageSource)rtb.Clone(); 
BitmapFrame bp = CreateResizedImage(im, width, height, 1); //method suggested by Erti-Chris Eelmaa 
string dir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\temp\"; 

if (!Directory.Exists(dir)) 
    Directory.CreateDirectory(dir); 

long size = 0; 

string filePath = dir + DateTime.Now.Ticks.ToString() + (isPng ? ".png" : ".jpg"); 
BitmapEncoder enc = null; 

using (FileStream fs = File.Create(filePath)) 
{ 
    if (isPng) 
     enc = new PngBitmapEncoder(); 
    else 
     enc = new JpegBitmapEncoder(); 


    enc.Frames.Add(BitmapFrame.Create(bp)); 
    enc.Save(fs); 

    size = fs.Length; 
} 
+0

你需要創建後更改位圖的高度和寬度。你在這裏做的是你正在製作一個小尺寸的新位圖,並在不調整大小的情況下用原始圖片填充它。您可以創建原始大小的位圖,然後使用其高度和寬度來更改其大小。 –

+0

@FaisalHafeez你能解釋一下嗎?我如何重新調整它的大小 – DevT

+0

這裏你正在製作一個寬度和高度尺寸的位圖。現在這個尺寸減小了。但是當你用圖像填充它時,它只會複製圖像的一部分(這是發生在你的案例中的)。你需要使用一些其他功能來實現這一點。 –

回答

14

只要使用此方法來獲取BitmapFrame,在這之後你可以將它保存使用PngBitmapEncoder到硬盤。

private static BitmapFrame CreateResizedImage(ImageSource source, int width, int height, int margin) 
{ 
    var rect = new Rect(margin, margin, width - margin * 2, height - margin * 2); 

    var group = new DrawingGroup(); 
    RenderOptions.SetBitmapScalingMode(group, BitmapScalingMode.HighQuality); 
    group.Children.Add(new ImageDrawing(source, rect)); 

    var drawingVisual = new DrawingVisual(); 
    using (var drawingContext = drawingVisual.RenderOpen()) 
     drawingContext.DrawDrawing(group); 

    var resizedImage = new RenderTargetBitmap(
     width, height,   // Resized dimensions 
     96, 96,    // Default DPI values 
     PixelFormats.Default); // Default pixel format 
    resizedImage.Render(drawingVisual); 

    return BitmapFrame.Create(resizedImage); 
} 
+0

我已經使用了這個函數,你的意思是代替'RenderTargetBitmap'使用'PngBitmapEncoder' r8?如果是這樣,我怎麼能保存'enc.Frames.Add(BitmapFrame.Create(rtb));'因爲在這裏它需要視覺對象。 – DevT

+0

我編輯了我的問題。當我保存這樣可以保存黑色圖片。這是爲什麼? – DevT

+0

能夠解決問題。謝謝.... – DevT

14

至於調整本身,使用WPF的TransformedBitmap似乎有點簡單:

var bitmap = new TransformedBitmap(bitmapSource, 
    new ScaleTransform(
     newWidth/bitmapSource.PixelWidth, 
     newHeight/bitmapSource.PixelHeight));