我正在尝试使用本机函数读取图像。为此,我尝试使用以下代码:
var result = new Bitmap((int)info.width,(int)info.height,PixelFormat.Format24bppRgb);
var data = result.LockBits(new Rectangle(0, 0, result.Width, result.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
bool success = ReadFullImage(data.Scan0, ref info, ref png);
result.UnlockBits(data);
if (!success)
return null;
else
{
return result;
}
其中info
包含图像的高度和宽度,png
ispng_struct
和ReadFullImage
is wrapper around png_read_image
。但是,我遇到了访问冲突(异常代码 0xc0000005)。
之后,我查看了值data
持有,我发现了这一点:
data {System.Drawing.Imaging.BitmapData} System.Drawing.Imaging.BitmapData
Height 1557 int
m_bmpdata {Microsoft.AGL.Drawing.AGL_BITMAPDATA} Microsoft.AGL.Drawing.AGL_BITMAPDATA
PixelFormat Format24bppRgb System.Drawing.Imaging.PixelFormat
Scan0 1638432 System.IntPtr
Stride 1512 int
Width 503 int
其中似乎存在问题。正在写入的行的大小为 2012 字节,但只有 1512 字节可用,不久之后就会在分配的内存之外进行写入尝试。
问题是,为什么行的大小只有 1512=503*3+3,尽管格式是每像素 24 位,以及如何分配足够的内存并将其馈送到位图中?
或者,可以以兼容的方式使用 libpng 读取 png 吗?
更新:ReadFullImage 是一个 DllImport
extern "C" void read_image_full( unsigned char * buffer,pngImageInfo* info,pngDataStructures* png)
{
png_bytepp row_pointers = new png_bytep[info->height];
for (unsigned int i = 0; i < info->height; ++i)
row_pointers[i] = buffer + i*info->rowbytes;
png_read_image(png->png_struct_field, row_pointers);
return true;
}
并且通过 png_get_rowbytes 检索行字节。