2013-09-24 1 views
0

Я использую Windows Phone CameraCaptureTask, чтобы собрать изображение, а затем изменить его размер для лучшего использования в моем приложении. По какой-то причине, независимо от того, что я пробовал, я не могу изменить размер изображения.Изменение размера изображения с использованием WriteableBitmap не работает

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 = new WriteableBitmap(bmi); 
     //WriteableBitmap wb; 
     //Stream stream = new MemoryStream(); 
     var stream = new MemoryStream(); 


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

     stream.Seek(0, SeekOrigin.Begin); 
     //stream.Dispose(); 

     MessageBox.Show(wb.PixelWidth.ToString() + " x " + wb.PixelHeight.ToString()); 

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

Независимо от того, что я делаю, установив WriteableBitmap в любом e.ChosenPhoto или bmi заставляет результирующую wb быть первоначальный размер. Есть идеи?

+0

Вы не изменить размер WriteableBitmap, вы сохранили копию измененного его в поток. Попробуйте использовать метод SetSource или LoadJpeg после сохранения. –

+0

Я немного смущен. Поскольку для класса 'CapturedPicture' требуется имя файла и поток изображений в качестве параметров, я подумал о сохранении измененной копии записи WriteableBitmap в потоке, и использование ее таким образом было правильным? Как изменить размер WriteableBitmap и использовать поток для моего класса CapturedPicture? Мне трудно понять, как наилучшим образом реализовать ваше предложение. – Matthew

+0

В ссылке http://msdn.microsoft.com/EN-US/library/windowsphone/develop/system.windows.media.imaging.extensions.savejpeg(v=vs.105).aspx Я использовал 'SaveJpeg' для кодирования потока jpeg, который требуется для того, когда изображение сохраняется в приложении. Я использую этот метод в другом месте приложения, который отлично работает, но в этом случае я должен сначала изменить размер изображений, в которых я застреваю. – Matthew

ответ

3

попробуйте использовать WriteableBitmapExWinPhone.dll

wb = wb.Resize(Convert.ToInt32(pass value of width here), Convert.ToInt32(pass value of height here), WriteableBitmapExtensions.Interpolation.Bilinear); 

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

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