2016-12-27 10 views
0

의 일정 금액의 크기를 조정 이미 이미지 크기 조정 및 감소 품질에 대한 스택에 글을 많이 읽고,하지만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 % } 코드를 하드 코딩하면 크기를 조정하여 이미지 품질을 떨어 뜨리지 만 이미지가 20MB이면 출력이 3 이하가됩니까? 아니, 그래서 다시 크기를 조정해야합니다. – Cheese