0

Я получаю изображение из CameraCaptureTask, и я хотел бы, чтобы изображение было намного меньше, прежде чем сохранять. Ширина и высота автоматически устанавливаются на самое высокое разрешение, что намного больше, чем мне нужно. Я пытаюсь получить изображение, изменить размеры, а затем попытаться сохранить, хотя я получаю ошибки.Как изменить размер изображения

Подлинные

MainPage.xaml.cs

private void cameraTask_Completed(object sender, PhotoResult e) 
    { 
     if (e.TaskResult == TaskResult.OK) 
     { 
      BitmapImage bmi = new BitmapImage(); 
      bmi.SetSource(e.ChosenPhoto); 
      //MessageBox.Show(bmi.PixelWidth.ToString() + "x" + bmi.PixelHeight.ToString()); 

      var gcd = GCD(bmi.PixelWidth, bmi.PixelHeight); 
      var result = string.Format("{0}:{1}", bmi.PixelWidth/gcd, bmi.PixelHeight/gcd); 

      WriteableBitmap wb; 
      Stream stream; 

      switch (result) 
      { 
       case "3:4": 
        wb = new WriteableBitmap(480,640); 
        break; 
       case "4:3": 
        wb = new WriteableBitmap(640,480); 
        break; 
       case "9:16": 
        wb = new WriteableBitmap(448, 800); 
        break; 
       case "16:9": 
        wb = new WriteableBitmap(800, 448); 
        break; 
       default: 
        wb = null; 
        return; 
      } 
      //Set the wb to the original stream? 
      wb.SetSource(e.ChosenPhoto); 

      //Convert the wb to a stream for saving 
      stream = new MemoryStream(wb.ToByteArray()); 

      //Need to replace the following line with the new image stream for saving? 
      //var capturedPicture = new CapturedPicture(e.OriginalFileName, e.ChosenPhoto); 
      var capturedPicture = new CapturedPicture(e.OriginalFileName, stream);   

     } 
    } 

    public int GCD(int a, int b) 
    { 
     while (a != 0 && b != 0) 
     { 
      if (a > b) 
       a %= b; 
      else 
       b %= a; 
     } 
     if (a == 0) 
      return b; 
     else 
      return a; 
    } 

EDIT: новая реализация

private void cameraTask_Completed(object sender, PhotoResult e) 
    { 
     if (e.TaskResult == TaskResult.OK) 
     { 
      BitmapImage bmi = new BitmapImage(); 
      bmi.SetSource(e.ChosenPhoto); 

      var gcd = GCD(bmi.PixelWidth, bmi.PixelHeight); 
      var result = string.Format("{0}:{1}", bmi.PixelWidth/gcd, bmi.PixelHeight/gcd); 

      WriteableBitmap wb = new WriteableBitmap(bmi); 
      Stream stream = new MemoryStream(); 

      switch (result) 
      { 
       case "3:4": 
        wb.SaveJpeg(stream, 480, 640, 0, 100); 
        break; 
       case "4:3": 
        wb.SaveJpeg(stream, 640, 480, 0, 100); 
        break; 
       case "9:16": 
        wb.SaveJpeg(stream, 448, 800, 0, 100); 
        break; 
       case "16:9": 
        wb.SaveJpeg(stream, 800, 448, 0, 100); 
        break; 
       default: 
        wb = null; 
        return; 
      } 

      stream.Seek(0, SeekOrigin.Begin); 

      //var capturedPicture = new CapturedPicture(e.OriginalFileName, e.ChosenPhoto);     
      var capturedPicture = new CapturedPicture(e.OriginalFileName, stream); 

ответ

0

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

public static Image resizeImage(Image imgToResize, Size size) 
{ 
    return (Image)(new Bitmap(imgToResize, size)); 
} 

yourImage = resizeImage(yourImage, new Size(50,50)); 
+0

Как создать поток из нового изображения для 'var capturePicture = new CapturedPicture (e.OriginalFileName, i);' где 'i' является потоком? Следует отметить, что 'CapturedPicture' - это класс, который требует, чтобы имя изображения и результирующий поток сохраняли изображение в' IsolatedStorage'. – Matthew

+0

Кроме того, я использую .Net 4.5 для Windows Phone, а «Bitmap» не существует, поэтому я использовал «BitmapImage» и «WriteableBitmap». – Matthew

+0

Я немного изменил свою реализацию, чтобы непосредственно присвоить 'WriteableBitmap' новым размером исходный результат потока' e.ChosenPhoto', но возникает новая ошибка, говорящая о том, что используется использование неназначенной локальной переменной wb''? – Matthew

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