使用FJCORE编码Silverlight WritablebitMap
-
16-09-2019 - |
题
我正在尝试找出如何使用fjcore编码可写入的jpeg。我知道WritableBitMap提供了原始像素,但我不确定如何将其转换为FJCORE对其Jpegencoder方法的期望的格式。 jpegencoder有两个过载,一个是fluxjpeg.core.core.image,另一个则取代jpeg。
我试图创建一个fluxjpeg.core.core.image,但希望图像数据的字节[] []。字节[n] [x,y]其中x为宽度,y为高度,但我不知道应该是什么。
我认为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);
解决方案
弄清楚了!我下载了 来自code.google.com的fjcore 并参加了图像课。它只期望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;
}
其他提示
此代码很好,应该可以工作。我使用相同的代码将图像流通过Web服务发送到服务器,而不是使用这些字节再生图像...您也可以将这些字节保存到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]应该是图像的字节阵列,我一直在考虑编码可写入的bitigbitmap,并找到了同一库,但没有详细研究它,但假设是这种情况,会添加更多稍后回答以查看这是否有效,因为我还没有机会尝试。我想可以在Silverlight中获取WritableBitMap的字节,因为可以保存到其他类型。
不隶属于 StackOverflow