Как мне сжать изображение на Windows Phone - PullRequest
5 голосов
/ 17 февраля 2012

Мое приложение использует камеру, чтобы сделать снимок и загрузить его на flickr.Я бы хотел сжать изображение, чтобы загрузка не заняла столько времени, сколько сейчас.Я попытался как BitmapSource, так и метод SaveJpeg в WriteableBitmap, чтобы выполнить это, но не получилось.В источнике растрового изображения нет тех же элементов, доступных в Silverlight / WP, как в полной версии платформы .NET, и метод SaveJpeg, который WriteableBitmap продолжает давать мне сообщение об ошибке «Этот поток не поддерживает запись в него».

Это то, что я сейчас делаю в обработчике завершенных событий CameraCaptureTask:

private void CameraCaptureCompleted(object sender, PhotoResult e)
    {
        if (e == null || e.TaskResult != TaskResult.OK)
        {
            return;
        }                                                             
        BitmapImage bitmap = new BitmapImage {CreateOptions = BitmapCreateOptions.None};                        
        bitmap.SetSource(AppHelper.LoadImage(e.ChosenPhoto));
        WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap);

        // Encode the WriteableBitmap object to a JPEG stream.
        writeableBitmap.SaveJpeg(e.ChosenPhoto, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 85);
    }

Этот код дает мне сообщение: «Поток не поддерживает запись».

Есть ли какие-тоиначе я мог бы сжать изображение, или мне пришлось бы написать алгоритм сжатия?

ОБНОВЛЕНИЕ ОБНОВЛЕНО !!

private void CameraCaptureCompleted(object sender, PhotoResult e)
    {
        if (e == null || e.TaskResult != TaskResult.OK)
        {
            return;
        }                                                             
        BitmapImage bitmap = new BitmapImage {CreateOptions = BitmapCreateOptions.None};                        
        bitmap.SetSource(AppHelper.LoadImage(e.ChosenPhoto));
        WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap);

        // Encode the WriteableBitmap object to a JPEG stream.
        writeableBitmap.SaveJpeg(new MemoryStream(), writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 85);
    }

Я пытался записать в исходный поток.Дох!

Спасибо.

1 Ответ

3 голосов
/ 17 февраля 2012

SaveJpeg - способ, которым я сделал бы это, я думаю.Возможно, вы могли бы сделать это другими способами, но я думаю, что это будет самым простым и естественным.Ошибка «Этот поток не поддерживает запись в него», скорее всего, потому что любой поток, который вы передаете SaveJpeg, не доступен для записи.Я не совсем уверен, к чему вы пытаетесь написать, попробуйте использовать просто старый поток памяти и посмотреть, работает ли он так

using System.IO;

// ...

MemoryStream ms = new MemoryStream();
pic.SaveJpeg(ms, pic.PixelWidth, pic.PixelHeight, 0, 0, 50);

. Вы можете настроить качество в конечном параметре.PixelWidth / Height - от WriteableBitmap, поэтому, если у вас есть какой-то другой источник, вам, возможно, придется использовать другой метод / свойство, чтобы получить ширину / высоту.Вы можете масштабировать их, так как изображения с камеры могут быть довольно большими.Это зависит от того, для чего вы загружаете эти картинки, но масштабируя их, вы также можете уменьшить размер файла.

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