2013-04-03 17 views
5

Ho un'immagine e voglio ridimensionarla e ho bisogno di salvarla nella mia cartella temporanea.Ridimensiona immagine in WPF

quello che ho provato è il seguente:

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

ma quando creo un'immagine come questo consente di risparmiare parte dell'immagine nella cartella Temp. (Come mostrato nella foto sopra)

enter image description here

come può dimensione dell'immagine completa i ri? cosa mi è mancato qui?

EDIT: Come accennato nella risposta precedente, come già detto da Erti-Chris Eelmaa ho cambiato il codice, come di seguito. e funziona ......

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

È necessario cambiare altezza e la larghezza della bitmap dopo la creazione. Quello che stai facendo qui è che stai creando una nuova Bitmap di piccole dimensioni e riempiendola di un'immagine originale senza ridimensionarla. Crei una bitmap della dimensione originale e quindi ne usi l'altezza e la larghezza per modificarne le dimensioni. –

+0

@FaisalHafeez puoi spiegarci meglio? come posso ridimensionarlo – DevT

+0

Qui stai facendo una bitmap di larghezza e altezza. Ora questo è di dimensioni ridotte. Ma quando lo riempirai di immagine, copierà solo parte dell'immagine (ciò accade nel tuo caso). È necessario utilizzare qualche altra funzione per implementare questo. –

risposta

14

basta usare questo metodo per ottenere BitmapFrame, dopo che si può solo salvarlo HDD utilizzando 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

ho usato questa funzione e invece di 'RenderTargetBitmap' usiamo' PngBitmapEncoder' r8? in tal caso, come posso salvare 'enc.Frames.Add (BitmapFrame.Create (rtb));' perché qui aveva bisogno di un oggetto visivo. – DevT

+0

ho modificato la mia domanda. quando salvo così mi salva l'immagine nera. perché? – DevT

+0

in grado di risolvere il problema. Grazie.... – DevT

14

per quanto concerne tale ridimensionamento, utilizzando WPF di TransformedBitmap sembra un po 'più facile:

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