2016-12-27 20 views
0

я уже прочитал много постов на Stack о изменении размера и качестве изображения восстановителя, но не из них был о снижении качества до определенного физического дискового пространстваC# StorageFile изображения изменять размер определенного количества байт

У меня есть код, который делает снимок:

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) 
    { 

    } 
} 

Теперь мне нужно отправить данные на сервер, но прежде, я должен убедиться, что фото не более 3 МБ.

Так я это сделать:

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

Таким образом, вопрос о ELSE блок

Есть ли лучше или, может быть, я пропустил некоторые встроенные в подход, чтобы соответствовать изображение в определенное количество мегабайт, уменьшив его качество?

Так как это сделать:

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

Не очень хорошо выглядеть.

+0

Я не думаю, что есть гораздо лучше. Да, вы можете применить некоторые эвристики (например, если файл намного больше, чем вам нужно - уменьшите качество более 10%), но все равно будет цикл и несколько сокращений качества (или даже уменьшение размера, если снижение качества не поможет) , – Evk

ответ

0

Просто создать одну функцию:

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

И затем вызвать эту функцию в еще блоке, как показано ниже, вы получите то же изображение с уменьшенным размером:

 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

спасибо за код уменьшения размера, но основная часть, которая была интересна, если я могу избавиться от этого: while (pro.Size <= 3072) { photo = // некоторая логика для снижения качества на 10% } Ваш код жестко закодирован, уменьшает качество изображения, изменяя его размер, но если мое изображение будет 20 МБ - будет ли выход 3 или меньше? Нет, так что мне придется изменить размер снова и т. Д. – Cheese

 Смежные вопросы

  • Нет связанных вопросов^_^