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)
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;
}
È 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. –
@FaisalHafeez puoi spiegarci meglio? come posso ridimensionarlo – DevT
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. –