0

我想获得透明的文件缩略图。
我有以下代码来实现它:

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;
}

我从这里混合了代码:
有一种在 BitmapSource 和 Bitmap 之间转换的好方法吗?

从 System.Drawing.Bitmap 加载 WPF BitmapImage

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

4

2 回答 2

4

您需要将 编码BitmapSource为 a 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;
}
于 2013-09-20T01:55:10.330 回答
-1

您是否尝试过:(System.Drawing.Imaging.PixelFormat.Format32bppArgb 在Format32-P-Argb 之间没有P)

MSDN:

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

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

于 2013-09-20T00:02:34.573 回答