Я использую 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
быть первоначальный размер. Есть идеи?
Вы не изменить размер WriteableBitmap, вы сохранили копию измененного его в поток. Попробуйте использовать метод SetSource или LoadJpeg после сохранения. –
Я немного смущен. Поскольку для класса 'CapturedPicture' требуется имя файла и поток изображений в качестве параметров, я подумал о сохранении измененной копии записи WriteableBitmap в потоке, и использование ее таким образом было правильным? Как изменить размер WriteableBitmap и использовать поток для моего класса CapturedPicture? Мне трудно понять, как наилучшим образом реализовать ваше предложение. – Matthew
В ссылке http://msdn.microsoft.com/EN-US/library/windowsphone/develop/system.windows.media.imaging.extensions.savejpeg(v=vs.105).aspx Я использовал 'SaveJpeg' для кодирования потока jpeg, который требуется для того, когда изображение сохраняется в приложении. Я использую этот метод в другом месте приложения, который отлично работает, но в этом случае я должен сначала изменить размер изображений, в которых я застреваю. – Matthew