Как я могу получить PixelFormat BitmapSource - PullRequest
6 голосов
/ 16 июня 2011

Я использую следующее для преобразования BitmapSource в Bitmap:

internal static Bitmap ConvertBitmapSourceToBitmap(BitmapSource bitmapSrc)
{
    int width = bitmapSrc.PixelWidth;
    int height = bitmapSrc.PixelHeight;
    int stride = width * ((bitmapSrc.Format.BitsPerPixel + 7) / 8);

    byte[] bits = new byte[height * stride];

    bitmapSrc.CopyPixels(bits, stride, 0);

    unsafe
    {
        fixed (byte* pBits = bits)
        {
            IntPtr ptr = new IntPtr(pBits);

            return new System.Drawing.Bitmap(
                width,
                height,
                stride,
                System.Drawing.Imaging.PixelFormat.Format32bppPArgb, //The problem
                ptr);
        }
    }
}

Но я не знаю, как получить PixelFormat из BitmapSource, поэтому мои изображения искажены.

Для контекста, я использую эту технику, потому что я хочу загрузить tiff, который может быть 8 или 16 серым или 24 или 32-битным цветом, и мне нужно, чтобы PixelFormat был сохранен. Я бы предпочел исправить мой ConvertBitmapSourceToBitmap, поскольку он довольно удобен, но также был бы рад заменить следующий код на лучший метод для создания растрового изображения из BitmapSource:

Byte[] buffer = File.ReadAllBytes(filename.FullName);
using (MemoryStream stream = new MemoryStream(buffer))
{
    TiffBitmapDecoder tbd = new TiffBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);

    return BitmapBitmapSourceInterop.ConvertBitmapSourceToBitmap(tbd.Frames[0]);
}

1 Ответ

5 голосов
/ 16 июня 2011

Что-то не так с использованием BitmapSource.Format ? Этот является форматом Pixel, и вы уже используете его для определения шага.

...