C# windows mobile中的位图数据大小

C# windows mobile中的位图数据大小,c#,bitmap,windows-mobile,bitmapdata,libpng,C#,Bitmap,Windows Mobile,Bitmapdata,Libpng,我正在尝试使用本机函数读取图像。为此,我尝试使用以下代码: 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.Form

我正在尝试使用本机函数读取图像。为此,我尝试使用以下代码:

        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
png\u结构
ReadFullImage
png\u读取图像
的包装。但是,我遇到了访问冲突(异常代码0xc0000005)

之后,我查看了值
数据
保持,我发现:

        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是

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;
}
extern“C”void read_image_full(无符号字符*缓冲区、pngImageInfo*信息、pngDataStructures*png)
{
png_bytepp row_pointers=new png_bytep[info->height];
对于(无符号整数i=0;iheight;++i)
行指针[i]=缓冲区+i*信息->行字节;
png_读取_图像(png->png_结构_字段,行_指针);
返回true;
}

而行字节是通过png_get_rowbytes检索的。

首先,据我所知,24/8=3,所以503*(24/8)=1509,那么步幅值是正确的

另一件事是png\u read\u image使用指针数组,而Scan0不是指针数组。这意味着png\u read\u image从Scan0读取数据(但它是只写的),并将该数据解释为指针

您可以尝试以下方法(未测试)。您需要修改ReadFullImage的第一个参数(现在是int[]):

var result=新位图((int)info.width,(int)info.height,PixelFormat.Format24bppRgb);
var data=result.LockBits(新矩形(0,0,result.Width,result.Height)、ImageLockMode.WriteOnly、PixelFormat.Format24bppRgb);
int y,ptr=data.Scan0.ToInt32();
int[]行=新int[result.Height];
对于(y=0;y

我假设这是一个32位的应用程序。

我知道png_read_image接受一个指针数组(请参阅wrapper代码的更新),但正如您所指出的,24/8实际上是3(其他3个字节应该是填充的,因为行必须可以被4整除),而且很可能,我在基本AryphMethodic和在.NET代码和libpng中类似地设置像素格式方面都失败了。如果libpng需要2012字节来读取503像素行,我认为应该使用PixelFormat.Format32bppRgb或逐行解码(使用png_read_row),但这可能会很棘手……嗯,对我来说,使用libpng的全部目的就是使用png_read_row并逐行重新读取它;将格式更改为每像素32位效果非常好。
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);
int y, ptr = data.Scan0.ToInt32();
int[] lines = new int[result.Height];
for (y = 0; y < lines.Length; y++)
{
    lines[y] = ptr;
    ptr += data.Stride;
}
bool success = ReadFullImage(lines, ref info, ref png);
result.UnlockBits(data);
if (!success)
    return null;
else
{
    return result;
}