2016-12-27 2 views
0

Ich habe schon viele Beiträge auf Stapel über Ändern der Bildgröße und Qualität zu reduzieren, aber nicht von ihnen hat Qualität auf bestimmte physikalische SpeicherplatzC# StorageFile Bild auf bestimmte Menge an Bytes die Größe

ich über die Verringerung haben Code, der ein Bild aufnimmt:

private async void TakeAPhoto_Click(object sender, RoutedEventArgs e) 
{ 
    CameraCaptureUI captureUI = new CameraCaptureUI(); 
    captureUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Jpeg; 

    StorageFile photo = await captureUI.CaptureFileAsync(CameraCaptureUIMode.Photo); 
    if (photo != null) 
    { 

    } 
} 

Jetzt muss ich die Daten an den Server senden, aber vor, muss ich sicherstellen, dass das Foto nicht mehr als 3 MB ist.

So mache ich das:

BasicProperties pro = await photo.GetBasicPropertiesAsync(); 
if (pro.Size < 3072) 
{ 
    // SEND THE FILE TO SERVER 
} 
else 
{ 
    // DECREASE QUALITY BEFORE SENDING 
} 

So ist die Frage ELSE wird über Block

gibt es eine bessere oder vielleicht habe ich einige integrierte in Ansatz verfehlt Bild in den bestimmten Betrag passen von Megabyte durch die Verringerung der Qualität?

Da dies zu tun:

while (pro.Size <= 3072) 
{ 
    photo = // some logic to decrease quality on 10% 
} 

nicht wirklich gut aussehen.

+0

Ich glaube nicht, dass es eine ist viel besser. Ja, Sie können einige Heuristiken anwenden (zB wenn die Datei viel größer ist als Sie brauchen - die Qualität um mehr als 10% reduzieren), aber es wird immer eine Schleife und mehrere Qualitätsreduktionen geben (oder sogar Größenreduktion, wenn die Qualität nicht hilft) . – Evk

Antwort

0

erstellen nur eine Funktion:

/// <summary> 
    /// function to reduce image size and returns local path of image 
    /// </summary> 
    /// <param name="scaleFactor"></param> 
    /// <param name="sourcePath"></param> 
    /// <param name="targetPath"></param> 
    /// <returns></returns> 
    private string ReduceImageSize(double scaleFactor, Stream sourcePath, string targetPath) 
    { 
     try 
     { 
      using (var image = System.Drawing.Image.FromStream(sourcePath)) 
      { 
       //var newWidth = (int)(image.Width * scaleFactor); 
       //var newHeight = (int)(image.Height * scaleFactor); 


       var newWidth = (int)1280; 
       var newHeight = (int)960; 

       var thumbnailImg = new System.Drawing.Bitmap(newWidth, newHeight); 
       var thumbGraph = System.Drawing.Graphics.FromImage(thumbnailImg); 
       thumbGraph.CompositingQuality = CompositingQuality.HighQuality; 
       thumbGraph.SmoothingMode = SmoothingMode.HighQuality; 
       thumbGraph.InterpolationMode = InterpolationMode.HighQualityBicubic; 
       var imageRectangle = new System.Drawing.Rectangle(0, 0, newWidth, newHeight); 
       thumbGraph.DrawImage(image, imageRectangle); 
       thumbnailImg.Save(targetPath, image.RawFormat); 
       return targetPath; 



      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Exception in ReduceImageSize" + e); 
      return ""; 
     } 
    } 

Und dann diese Funktion in Ihrem else-Block aufrufen, wie unten Sie gleiche Bild mit reduzierter Größe erhalten wird:

 string ImageLink = "https://imagesus-ssl.homeaway.com/mda01/337b3cbe-80cf-400a-aece-c932852eb929.1.10"; 
     string [email protected]"F:\ReducedImage.png"; 
     HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(ImageLink); 
     WebResponse imageResponse = imageRequest.GetResponse(); 
     Stream responseStream = imageResponse.GetResponseStream(); 

     string ImagePath= ReduceImageSize(0.5, responseStream, FinalTargetPath); 
+0

danke für die größe reduktion code, aber der hauptteil, der interessant war, wenn ich diese loswerden kann: while (pro.Size <= 3072) { foto = // einige logik zu verringern qualität auf 10% } Ihr Code hardcoded reduziert die Qualität des Bildes durch Größenanpassung, aber wenn mein Bild wird 20 MB - wird die Ausgabe 3 oder weniger? Nein, also muss ich die Größe ändern usw. – Cheese

Verwandte Themen