3

GDI+ はCF_DIBV5フォーマットをサポートしていませんが、いくつかのアプリケーションがCF_DIBV5アルファ チャネルを維持するために (フォーマット 17) フォーマットを使用してクリップボードに透明な画像を配置する場合。

.NET Framework はCF_DIBV5フォーマットを処理できないため、.NET アプリケーションはアルファ イメージをクリップボードに出し入れできません。

CF_DIBV5クリップボードからのビットマップ変換をサポートする c# コードはありますか?

4

2 に答える 2

6

ごめん!私は自分の質問に答えています:

[StructLayout(LayoutKind.Sequential)]
public struct BITMAPV5HEADER
{
  public uint bV5Size;
  public int bV5Width;
  public int bV5Height;
  public UInt16 bV5Planes;
  public UInt16 bV5BitCount;
  public uint bV5Compression;
  public uint bV5SizeImage;
  public int bV5XPelsPerMeter;
  public int bV5YPelsPerMeter;
  public UInt16 bV5ClrUsed;
  public UInt16 bV5ClrImportant;
  public UInt16 bV5RedMask;
  public UInt16 bV5GreenMask;
  public UInt16 bV5BlueMask;
  public UInt16 bV5AlphaMask;
  public UInt16 bV5CSType;
  public IntPtr bV5Endpoints;
  public UInt16 bV5GammaRed;
  public UInt16 bV5GammaGreen;
  public UInt16 bV5GammaBlue;
  public UInt16 bV5Intent;
  public UInt16 bV5ProfileData;
  public UInt16 bV5ProfileSize;
  public UInt16 bV5Reserved;
}        
public static Bitmap CF_DIBV5ToBitmap(byte[] data)
{
    GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
    var bmi = (BITMAPV5HEADER)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BITMAPV5HEADER));
    Bitmap bitmap = new Bitmap((int)bmi.bV5Width, (int)bmi.bV5Height, -
                               (int)(bmi.bV5SizeImage / bmi.bV5Height), PixelFormat.Format32bppArgb,
                               new IntPtr(handle.AddrOfPinnedObject().ToInt32()
                               + bmi.bV5Size + (bmi.bV5Height - 1) 
                               * (int)(bmi.bV5SizeImage / bmi.bV5Height)));
    handle.Free();
    return bitmap;
}   
于 2013-01-15T10:22:44.867 に答える