获取文件具有透明度的缩略图图像

时间:2013-09-19 23:58:05

标签: c# wpf bitmap bitmapimage bitmapsource

我希望获得具有透明度的文件缩略图 我有以下代码来实现它:

BitmapImage GetThumbnail(string filePath)
{
    ShellFile shellFile = ShellFile.FromFilePath(filePath);
    BitmapSource shellThumb = shellFile.Thumbnail.ExtraLargeBitmapSource;

    Bitmap bmp = new Bitmap(shellThumb.PixelWidth, shellThumb.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
    BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
    shellThumb.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
    bmp.UnlockBits(data);

    MemoryStream ms = new MemoryStream();
    bmp.Save(ms, ImageFormat.Png);
    ms.Position = 0;
    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.StreamSource = ms;
    bi.CacheOption = BitmapCacheOption.None;
    bi.EndInit();

    return bi;
}

我从这里混合了代码:
Is there a good way to convert between BitmapSource and Bitmap?

Load a WPF BitmapImage from a System.Drawing.Bitmap

通过这种方式,我将BitmapSource转换为位图,然后将位图转换为BitmapImage。 我很确定有一种方法可以将BitmapSource直接转换为BitmapImage ,同时保存透明度

2 个答案:

答案 0 :(得分:4)

您需要将BitmapSource编码为BitmapImage,您可以在此示例中选择您想要的任何编码器我使用PngBitmapEncoder

示例:

    private BitmapImage GetThumbnail(string filePath)
    {
        ShellFile shellFile = ShellFile.FromFilePath(filePath);
        BitmapSource shellThumb = shellFile.Thumbnail.ExtraLargeBitmapSource;

        BitmapImage bImg = new BitmapImage();
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        var memoryStream = new MemoryStream();
        encoder.Frames.Add(BitmapFrame.Create(shellThumb));
        encoder.Save(memoryStream);
        bImg.BeginInit();
        bImg.StreamSource = memoryStream;
        bImg.EndInit();
        return bImg;
    }

答案 1 :(得分:-1)

你有没有尝试过:System.Drawing.Imaging.PixelFormat.Format32bppArgb(没有格式32-P-Argb之间的P)

MSDN:

Format32bppArgb - >指定格式为每像素32位;每个8位用于alpha,红色,绿色和蓝色组件。

Format32bppPArgb - >指定格式为每像素32位;每个8位用于alpha,红色,绿色和蓝色分量。根据alpha分量,红色,绿色和蓝色成分预乘