Изменение размера результирующего потока камеры - PullRequest
4 голосов
/ 25 апреля 2011

Я пытаюсь позволить пользователю захватить изображение и добавить его на экран, используя изображение. Тем не менее, мне также нужно изменить размер этого изображения примерно до половины размера из-за ограничений памяти (12x 5MP изображений никогда не бывает хорошим на телефоне ...)

Я нормально запускаю задачу камеры, и она вызывает событие Completed. Однако, когда я пытаюсь использовать DecodeJpeg, я получаю «Параметр неверен». исключение.

Вот мой код для изменения размера, где mx и my являются int для измерений. Я проверил, что в e.ChosenPhoto есть что-то около 5500:

WriteableBitmap bitmap = PictureDecoder.DecodeJpeg(e.ChosenPhoto, mx, my);
Image img = new Image();
img.Source = bitmap;

Первая строка, в которой происходит сбой приложения. Есть идеи?

EDIT: Это также происходит с результатом из PhotoChooserTask ....

Ответы [ 2 ]

4 голосов
/ 27 апреля 2011

Попробуйте использовать метод System.Windows.Media.Imaging - Extensions.LoadJpeg вместо PictureDecoder.DecodeJpeg . Также убедитесь, что поток расположен в начале потока. Если вы уже использовали поток, вам необходимо сбросить его, используя:

MyImageStream.Seek(0, System.IO.SeekOrigin.Begin)

У меня было много проблем при попытке получить доступ к исходному изображению, тем более что BitmapImage автоматически изменяет размеры изображений более 2000x2000 . Если вы хотите изображение размером более 2000x2000, вам нужно иметь доступ к исходному потоку и загрузить его в WriteableBitmap объект

Если вы хотите увидеть более сложный код обработки изображений, включая определение разрешения из потока изображений с использованием ExifLib и вращение потока с помощью WriteableBitmap Extensions , проверьте BarcodeCaptureResult класс для библиотеки Silverlight ZXing .

ОБНОВЛЕНИЕ: Поскольку все, что вам нужно, это изменить размер изображения с учетом результата e.ChosenPhoto, я извлек код из библиотеки Silverlight ZXing. Это должно работать:

WriteableBitmap wbBarcodeImage = new WriteableBitmap(mx, my);
Extensions.LoadJpeg(wbBarcodeImage, e.ChosenPhoto);//Load JPEG from stream into our re-sized writeable bitmap

Обратите внимание, что вам нужно будет использовать правильное соотношение высоты / ширины, в противном случае у вас будет черная полоса внизу или сбоку изображения. Вы можете использовать ExifLib для определения исходного размера изображения и использовать его для масштабирования (см. Метод GetWriteableBitmap в BarcodeCaptureResult, связанный выше)

0 голосов
/ 26 апреля 2011

Из любопытства, вы также получаете эту ошибку, если вызываете перегруженный метод DecodeJpeg, который имеет только 1 параметр (параметр потока), не передавая mx и мои целочисленные параметры выше?

Я просто пытаюсь понять, что проблема действительно в параметре stream, а не в mx или my.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...