Использование fjcore для кодирования Silverlight writeableBitmap
-
16-09-2019 - |
Вопрос
Я пытаюсь выяснить, как использовать FJCore, чтобы кодировать writeblebitmap в JPEG. Я понимаю, что writeablebitmap предоставляет необработанные пиксели, но я не уверен, как преобразовать его в формат, который FJCore ожидает своего метода jpegencoder. Jpegencoder имеет две перегрузки, одна принимает fluxjpeg.core.image, а другой - декодированная.
Я пытался создать fluxjpeg.core.image, но он ожидает байта [] [,] для данных изображения. Byte [n] [x, y], где x ширина, а Y - высота, но я не знаю, каким должен быть N.
Я думал, что n должен быть 4, так как это будет соответствовать информации ARGB, закодированной в каждом пикселе, но когда я попробовал этот FJCORE, выводит аргумент из исключения в диапазоне. Вот что я попробовал. Растр - мой байт [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);
Решение
Догадаться! Я загрузил 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;
}
Другие советы
Этот код в порядке, и он должен работать. Я использую тот же код для отправки потока изображений на сервер через веб -сервис и, чем регенерировать изображение, используя эти байты ... вы можете сохранить эти байты в 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 !";
}
Похоже, что [n] должен быть байтовой арестом изображения, я изучал кодирование writeablebitmap в JPEG и нашел ту же библиотеку, но не рассмотрел его подробно, но предположим, что это будет иметь место, добавит больше Позже к этому ответу, чтобы увидеть, работает ли это, так как у меня еще нет возможности попробовать его. Будет какой -то метод для получения байтов riseablebitmap в Silverlight, я полагаю, как это возможно сэкономить на других типах.