将未知格式的图像转换为特定格式

时间:2014-01-15 17:58:02

标签: c# wpf image

我正在使用WPF尝试将图像(未知格式)转换为必须采用每像素8位灰度格式的图像。另外,我必须提取一个包含像素数据的字节数组,并将其传递给其他软件进行处理。

图像作为包含byte数组的对象传递给我的代码,该数组包含图像的所有字节。也就是说,如果图像是jpeg,那么组成该文件的jpeg图像的字节就在对象的byte数组属性中。

这是我到目前为止所写的内容:

byte[] imageBytes;
try {
    BitmapImage src = new BitmapImage();
    try {
        using ( MemoryStream memoryStream = new MemoryStream( snapshot.ImageData ) ) {
            src.BeginInit();
            src.CacheOption  = BitmapCacheOption.OnLoad;
            src.StreamSource = memoryStream;
            src.EndInit();
        }
    } catch ( Exception ex ) {
        . . . 
        return;
    }
    FormatConvertedBitmap dst = new FormatConvertedBitmap();
    dst.BeginInit();
    dst.DestinationFormat = PixelFormats.Gray8;
    dst.Source = src;
    dst.EndInit();

    // Compute the dst Bitmap's stride (the length of one row of pixels in bytes).
    int stride = ( ( dst.PixelWidth * dst.Format.BitsPerPixel + 31 ) / 32 ) * 4;

    // Put the pixel bytes into the imageBytes array.
    imageBytes = new byte[ stride * dst.PixelHeight ];
    dst.CopyPixels( Int32Rect.Empty, imageBytes, stride, 0 );
} catch ( Exception ex ) {
    . . .
    return;
}

代码运行,但是当我将调用CopyPixels检索到的像素字节传递给其他软件时,图像处理不正确。

我添加了将FormatConvertedBitmap输出到.BMP文件的代码。我还添加了将byte返回的CopyPixels数组输出到.RAW文件的代码。当我在hex文件编辑器中比较字节流时,考虑到格式不同& BMP中的图像字节位于标题&之后。颜色表,字节不匹配,特别是在开头。也就是说,对于一个图像,BMP中的前4个字节是00 00 00 00,但RAW文件中的前4个字节是00 23 40 00.

我原以为CopyPixels返回的字节数组与BMP的字节数相同,从第一个到最后一个。

所以我的问题是,我的假设是错误的吗?如果他们错了,我怎么得到我想要的东西?如果他们是对的,我做错了什么?

0 个答案:

没有答案