Масштабирование PNG изображений в Silverlight - PullRequest
0 голосов
/ 29 июня 2011

В моем приложении я принимаю изображение от пользователя. Если изображение больше указанного размера, я уменьшаю размер до соответствующего размера и сохраняю в базе данных. Я использую библиотеку FJCore для масштабирования изображения. Библиотека хорошо работает с изображениями в формате JPEG. Но он не поддерживает изображения PNG. Кажется, что библиотека не обновляется в последнее время. Есть идеи, как это можно сделать в Silverlight?

Ответы [ 2 ]

0 голосов
/ 25 июля 2011

Я использовал проект WriteableBitmapEx, чтобы добиться этого.Вот код, если кому-то это нужно.

private void ShowCustomImageButton_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog openDialog = new OpenFileDialog();
        openDialog.Multiselect = false;
        openDialog.Filter = "PNG Files|*.PNG";
        bool? userClickedOK = openDialog.ShowDialog();
        if (userClickedOK == true)
        {                
            BitmapImage image = new BitmapImage();
            // get image that user has selected.
            image.SetSource(openDialog.File.OpenRead());
            WriteableBitmap wrtbmp = new WriteableBitmap(image);
            // resize image if needed.
            wrtbmp = wrtbmp.Resize(64, 64, WriteableBitmapExtensions.Interpolation.NearestNeighbor);
            var img = wrtbmp.ToImage();
            // convert image into file stream.
            Stream filestram = img.ToStream();
            filestram.Position = 0;
            using (filestram)
            {
                // convert file stream into memory stream.
                var memoryStream = new MemoryStream();
                byte[] aryBuffer = new byte[16384];
                int nRead = filestram.Read(aryBuffer, 0, aryBuffer.Length);
                while (nRead > 0)
                {
                    memoryStream.Write(aryBuffer, 0, nRead);
                    nRead = filestram.Read(aryBuffer, 0, aryBuffer.Length);
                }
                // use following line to convert in bytes and save into database.
                memoryStream.ToArray();
                imgCustomImage.Source = CreateBitmapImage(memoryStream);
            }                        
        }
    }

    private BitmapImage CreateBitmapImage(MemoryStream memoryStream)
    {
        if ((memoryStream == null) || (memoryStream.Length == 0))
            return null;         

        var image = new BitmapImage();
        image.SetSource(memoryStream);
        return image;      
    }
0 голосов
/ 29 июня 2011

Что вы можете сделать, это создать новый элемент Image и установить его источник на растровое изображение с возможностью записи, созданное из потока, но не добавляйте этот элемент Image в визуальное дерево. Создайте еще один WriteableBitmap конечного размера, который вам нужен, и затем вызовите render на этом WriteableBitmap, передав элемент Image и ScaleTransform, чтобы изменить размер изображения до соответствующего размера. Затем вы можете использовать второй WriteableBitmap в качестве источника для второго элемента Image и добавить его в визуальное дерево.

...