Изменение размера BitmapImage wp7

Как заставить это работать на WP7?

private static Bitmap ResizeBitmap(Bitmap sourceBMP, int width, int height)
{
    Bitmap result = new Bitmap(width, height);
    using (Graphics g = Graphics.FromImage(result))
        g.DrawImage(sourceBMP, 0, 0, width, height);
    return result;
}

person SevenDays    schedule 14.08.2011    source источник


Ответы (3)


Вот как я уменьшаю изображение, выбранное из медиатеки или снятое камерой, надеюсь, это поможет. Он сохраняет соотношение сторон.

    private void PhotoChooserTaskCompleted(object sender, PhotoResult e)
    {
        if (e.TaskResult != TaskResult.OK) return;

        var bmp = new BitmapImage();
        bmp.SetSource(e.ChosenPhoto);

        var scaledDownImage = AspectScale(bmp, 640, 480);

        MyImage.Source = scaledDownImage;
    }

    private BitmapImage AspectScale(BitmapImage img, int maxWidth, int maxHeigh)
    {
        double scaleRatio;

        if (img.PixelWidth > img.PixelHeight)
            scaleRatio = (maxWidth/(double) img.PixelWidth);
        else
            scaleRatio = (maxHeigh/(double) img.PixelHeight);

        var scaledWidth = img.PixelWidth * scaleRatio;
        var scaledHeight = img.PixelHeight * scaleRatio;

        using (var mem = new MemoryStream())
        {
            var wb = new WriteableBitmap(img);
            wb.SaveJpeg(mem, (int)scaledWidth, (int)scaledHeight, 0, 100);
            mem.Seek(0, SeekOrigin.Begin);
            var bn = new BitmapImage();
            bn.SetSource(mem);
            return bn;
        }
    }
person Johan Danforth    schedule 06.01.2014

Вы на самом деле не описали, что именно вы хотите, вы просто хотите сделать изображение больше/меньше на экране? или получить доступ к значениям пикселей измененного изображения?

  1. Чтобы отобразить растровое изображение в другом размере / масштабе, вы просто используете элемент Image и устанавливаете его Width / Height по желанию. Фреймворк позаботится о масштабировании за вас.
  2. Если вам нужно получить значения пикселей масштабированного результата, создайте WriteableBitmap из масштабированного изображения, описанного в (1).
person ColinE    schedule 14.08.2011
comment
2. Как это сделать? У меня есть изображение из медиатеки, и мне нужно отправить его по сети, и мне нужно сжать размер изображения (уменьшить размер). - person SevenDays; 14.08.2011

Вот как я уменьшил размер изображения, который слишком меньше 512 КБ, и сохранил изображение в изолированном хранилище. Внимание: только новичок в Windows Phone, поэтому, пожалуйста, придерживайтесь того, как я кодирую

private void PhotoChooserTaskCompleted (отправитель объекта, PhotoResult e) { if (e.TaskResult != TaskResult.OK) return;

  string Imgpath = "Rafiq.jpg";
                SaveToIsolatedStorage(e.ChosenPhoto, Imgpath);
}

Здесь, в этом методе, я передаю поток, который является e.choosen, и его имя файла

и сохранение изображения с измененным размером (размер изображения уменьшается менее чем на 512 КБ) в изолированном хранилище, надеюсь, это поможет вам,

private void SaveToIsolatedStorage(Stream imageStream, string fileName) { try { using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) {

                if (myIsolatedStorage.FileExists(fileName))
                {
                    myIsolatedStorage.DeleteFile(fileName);
                }
                IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(fileName);

                BitmapImage bitmap = new BitmapImage();
                bitmap.SetSource(imageStream);
                MessageBox.Show("ImageStream :"+ imageStream.Length.ToString());
                WriteableBitmap wb = new WriteableBitmap(bitmap);

         // reeducing less than 524288 byte array

                long compImageSize = 524288;
                long originalsize =  wb.ToByteArray().Length;

                if ((Convert.ToInt32(originalsize)) > compImageSize)
                {
                    WriteableBitmap wBitmap = new WriteableBitmap(bitmap);
                    int height = wBitmap.PixelHeight;
                    int width = wBitmap.PixelWidth;



                    while ((Convert.ToInt32(originalsize)) > compImageSize)
                    {
                        //  wb.Resize(Convert.ToInt32( wb.PixelWidth / 2), Convert.ToInt32(wb.PixelHeight / 2), WriteableBitmapExtensions.Interpolation.Bilinear);

                        // data = ChangeDimension(bitmap, Convert.ToInt32(bitmap.PixelWidth / 2), Convert.ToInt32(bitmap.PixelHeight / 2));

                        using (MemoryStream stream = new MemoryStream())
                        {
                            height = Convert.ToInt32(wBitmap.PixelHeight / 2);
                            width = Convert.ToInt32(wBitmap.PixelWidth / 2);

                            wBitmap.SaveJpeg(stream, width, height, 0, 100);
                            stream.Seek(0, SeekOrigin.Begin);
                            wBitmap.SetSource(stream);

                        }

                        originalsize = wBitmap.ToByteArray().Length;

                    }

                    wb.SaveJpeg(fileStream, width, height, 0, 100);
                }
                else
                {
                    wb.SaveJpeg(fileStream, wb.PixelWidth, wb.PixelHeight, 0, 100);
                }

                fileStream.Close();          


            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

надеюсь, это было полезноПолный

person Raphic --    schedule 07.01.2015