Использование FJCore для кодирования Silverlight WriteableBitmap

Я пытаюсь узнать, как использовать FJCore для кодирования WriteableBitmap в jpeg. Я понимаю, что WriteableBitmap предоставляет необработанные пиксели, но я не уверен, как преобразовать их в формат, который FJCore ожидает для своего метода JpegEncoder. JpegEncoder имеет две перегрузки: одна принимает FluxJpeg.Core.Image, а другая принимает DecodedJpeg.

Я пытался создать FluxJpeg.Core.Image, но он ожидает байта [] [,] для данных изображения. byte [n] [x, y], где x - ширина, а y - высота, но я не знаю, каким должно быть n.

Я думал, что n должно быть 4, поскольку это будет соответствовать информации argb, закодированной в каждом пикселе, но когда я попробовал, FJCore выдает исключение аргумента вне диапазона. Вот что я пробовал. Растр - это мой массив byte [4] [x, y].

raster[0][x, y] = (byte)((pixel >> 24) & 0xFF);
raster[1][x, y] = (byte)((pixel >> 16) & 0xFF);
raster[2][x, y] = (byte)((pixel >> 8) & 0xFF);
raster[3][x, y] = (byte)(pixel & 0xFF);

person RHLopez    schedule 16.07.2009    source источник


Ответы (3)


Догадаться! Я загрузил FJCore с code.google.com и прошел через класс изображений. Он ожидает только байты RGB. Вот функция, которую я написал. Мне нужна версия изображения base64, чтобы вернуть то, что возвращает моя функция.

    private static string GetBase64Jpg(WriteableBitmap bitmap)
    {
        int width = bitmap.PixelWidth;
        int height = bitmap.PixelHeight;
        int bands = 3;
        byte[][,] raster = new byte[bands][,];

        for (int i = 0; i < bands; i++)
        {
            raster[i] = new byte[width, height];    
        }

        for (int row = 0; row < height; row++)
        {
            for (int column = 0; column < width; column++)
            {
                int pixel = bitmap.Pixels[width * row + column];
                raster[0][column, row] = (byte)(pixel >> 16);
                raster[1][column, row] = (byte)(pixel >> 8);
                raster[2][column, row] = (byte)pixel;
            }
        }

        ColorModel model = new ColorModel { colorspace = ColorSpace.RGB };
        FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster);
        MemoryStream stream = new MemoryStream();
        JpegEncoder encoder = new JpegEncoder(img, 90, stream);
        encoder.Encode();

        stream.Seek(0, SeekOrigin.Begin);
        byte[] binaryData = new Byte[stream.Length];
        long bytesRead = stream.Read(binaryData, 0, (int)stream.Length);

        string base64String =
                System.Convert.ToBase64String(binaryData,
                                              0,
                                              binaryData.Length);

        return base64String;
    }
person RHLopez    schedule 18.07.2009
comment
Надеюсь, вы не возражаете, но я использовал ваш пример кода и расширил его до полной статьи, см .: blog.blueboxes.co.uk/2009/07/21/ и правильно указал вас, как по лицензии CC - person John; 21.07.2009
comment
Без проблем. Рад, что кто-то извлекает из этого пользу. - person RHLopez; 22.07.2009

Этот код в порядке, и он должен работать. Я использую тот же код для отправки потока изображения на сервер через веб-службу, а затем для восстановления изображения с использованием этих байтов ... вы также можете сохранить эти байты в Db

 [WebMethod]
 public string SaveImage(string data, string fileName)
 {
    byte[] imageBytes = System.Convert.FromBase64String(data);

    MemoryStream mem = new MemoryStream();
    mem.Write(imageBytes, 0, imageBytes.Length);

    System.Drawing.Image img = System.Drawing.Image.FromStream(mem);
    img.Save("D:\\FinalTest.jpg");      
    return "Saved !";
 }
person Waqar Ahmad    schedule 21.12.2009

Похоже, что [n] должен быть байтовым массивом изображения, я искал кодировку WriteableBitmap в JPEG и нашел ту же библиотеку, но не изучал ее подробно, но предположим, что это будет так, добавлю еще позже к этому ответу, чтобы узнать, работает ли это, так как у меня еще не было возможности попробовать. Я думаю, что будет какой-то способ получить байты WritableBitmap в Silverlight, поскольку его можно сохранить в другие типы.

person RoguePlanetoid    schedule 17.07.2009