从缓冲区数组创建 jpeg 图像
Create jpeg image from buffer array
我正在尝试从 RGBA 缓冲区数组中保存 jpeg 图像。
我试过这段代码
byte[] buffer = new byte[m_FrameProps.ImgSize];
Marshal.Copy(m_BM.BackBuffer, buffer, 0, m_FrameProps.ImgSize); //m_BM is WriteableBitmap
using (MemoryStream imgStream = new MemoryStream(buffer))
{
using (System.Drawing.Image image = System.Drawing.Image.FromStream(imgStream))
{
image.Save(m_WorkingDir + "1", ImageFormat.Jpeg);
}
}
但我收到 运行 时间错误:“'System.ArgumentException' 类型的未处理异常发生在 System.Drawing.dll
附加信息:参数无效。”
我还尝试创建位图,然后使用 JpegBitmapEncoder
Bitmap bitmap;
using (var ms = new MemoryStream(buffer))
{
bitmap = new Bitmap(ms);
}
但我遇到了同样的错误。
我猜是因为 alpha.
我应该怎么做?我是否需要循环值并在没有 alpha 的情况下复制?
无法仅从像素数据数组构建图像。至少还需要像素格式信息和图像尺寸。这意味着任何使用流直接从 ARGB 数组创建位图的尝试都会失败,Image.FromStream()
和 Bitmap()
方法都要求流包含某种 header 信息来构建图像.
也就是说,如果您似乎知道要保存的图像的尺寸和像素格式,则可以使用以下方法:
public void SaveAsJpeg(int width, int height, byte[] argbData, int sourceStride, string path)
{
using (Bitmap img = new Bitmap(width, height, PixelFormat.Format32bppPArgb))
{
BitmapData data = img.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, img.PixelFormat);
for (int y = 0; y < height; y++)
{
Marshal.Copy(argbData, sourceStride * y, data.Scan0 + data.Stride * y, width * 4);
}
img.UnlockBits(data);
img.Save(path, ImageFormat.Jpeg);
}
}
我正在尝试从 RGBA 缓冲区数组中保存 jpeg 图像。
我试过这段代码
byte[] buffer = new byte[m_FrameProps.ImgSize];
Marshal.Copy(m_BM.BackBuffer, buffer, 0, m_FrameProps.ImgSize); //m_BM is WriteableBitmap
using (MemoryStream imgStream = new MemoryStream(buffer))
{
using (System.Drawing.Image image = System.Drawing.Image.FromStream(imgStream))
{
image.Save(m_WorkingDir + "1", ImageFormat.Jpeg);
}
}
但我收到 运行 时间错误:“'System.ArgumentException' 类型的未处理异常发生在 System.Drawing.dll
附加信息:参数无效。”
我还尝试创建位图,然后使用 JpegBitmapEncoder
Bitmap bitmap;
using (var ms = new MemoryStream(buffer))
{
bitmap = new Bitmap(ms);
}
但我遇到了同样的错误。
我猜是因为 alpha.
我应该怎么做?我是否需要循环值并在没有 alpha 的情况下复制?
无法仅从像素数据数组构建图像。至少还需要像素格式信息和图像尺寸。这意味着任何使用流直接从 ARGB 数组创建位图的尝试都会失败,Image.FromStream()
和 Bitmap()
方法都要求流包含某种 header 信息来构建图像.
也就是说,如果您似乎知道要保存的图像的尺寸和像素格式,则可以使用以下方法:
public void SaveAsJpeg(int width, int height, byte[] argbData, int sourceStride, string path)
{
using (Bitmap img = new Bitmap(width, height, PixelFormat.Format32bppPArgb))
{
BitmapData data = img.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, img.PixelFormat);
for (int y = 0; y < height; y++)
{
Marshal.Copy(argbData, sourceStride * y, data.Scan0 + data.Stride * y, width * 4);
}
img.UnlockBits(data);
img.Save(path, ImageFormat.Jpeg);
}
}