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ます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 ビットが使用されます。

Format32bppPArgb-> フォーマットが 32 ビット/ピクセルであることを指定します。アルファ、赤、緑、青のコンポーネントには、それぞれ 8 ビットが使用されます。赤、緑、青の成分は、アルファ成分に従って事前に乗算されます。

于 2013-09-20T00:02:34.573 に答える