我正在使用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的字节数相同,从第一个到最后一个。
所以我的问题是,我的假设是错误的吗?如果他们错了,我怎么得到我想要的东西?如果他们是对的,我做错了什么?