ホームページ > バックエンド開発 > C++ > 透明性を維持したまま、透明な画像を Windows クリップボードにコピーして貼り付けるにはどうすればよいですか?

透明性を維持したまま、透明な画像を Windows クリップボードにコピーして貼り付けるにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-12 14:39:44
オリジナル
344 人が閲覧しました

How Can I Copy and Paste Transparent Images to the Windows Clipboard While Preserving Transparency?

透明な画像をクリップボードにコピーします

多くの開発者は、透明な画像をクリップボードにコピーするときに透明度を維持するのが困難に直面しています。デフォルトでは、Windows クリップボードは透明度をサポートしていません。

クリップボード データの透明性

クリップボード データの透明性をサポートするには、画像を複数の形式で含める必要があります:

  1. PNG: 透明度をサポートし、ほとんどの画像エディターやアプリケーションで広く受け入れられているロスレス画像形式。
  2. DIB (デバイス非依存ビットマップ) : 透明性を持つものとしてアプリケーションで一般にサポートされている ARGB 形式ですが、信頼性が低く、一貫性のない結果を引き起こす可能性があります。
  3. ビットマップ: 透明度をサポートしない標準画像形式。

画像を透明にしてコピー

透明度を維持したまま画像をコピーするには、次のコードを使用します:

<code class="language-c#">public static void SetClipboardImage(Bitmap image, Bitmap imageNoTr, DataObject data)
{
    Clipboard.Clear();
    if (data == null)
        data = new DataObject();
    if (imageNoTr == null)
        imageNoTr = image;
    using (MemoryStream pngMemStream = new MemoryStream())
    using (MemoryStream dibMemStream = new MemoryStream())
    {
        // 作为标准位图,不支持透明度
        data.SetData(DataFormats.Bitmap, true, imageNoTr);
        // 作为PNG。GIMP会优先选择此格式而不是其他两种。
        image.Save(pngMemStream, ImageFormat.Png);
        data.SetData("PNG", false, pngMemStream);
        // 作为DIB。许多应用程序(错误地)将其识别为ARGB。
        Byte[] dibData = ConvertToDib(image);
        dibMemStream.Write(dibData, 0, dibData.Length);
        data.SetData(DataFormats.Dib, false, dibMemStream);
        // 'copy=true' 参数表示在操作后可以安全地释放MemoryStream。
        Clipboard.SetDataObject(data, true);
    }
}</code>
ログイン後にコピー

クリップボードから画像を取得

クリップボードから画像を取得するには、次のコードを使用します:

<code class="language-c#">public static Bitmap GetClipboardImage(DataObject retrievedData)
{
    Bitmap clipboardimage = null;
    // 顺序:尝试PNG,然后尝试32位ARGB DIB,然后尝试普通的Bitmap和Image类型。
    if (retrievedData.GetDataPresent("PNG", false))
    {
        MemoryStream png_stream = retrievedData.GetData("PNG", false) as MemoryStream;
        if (png_stream != null)
            using (Bitmap bm = new Bitmap(png_stream))
                clipboardimage = ImageUtils.CloneImage(bm);
    }
    if (clipboardimage == null && retrievedData.GetDataPresent(DataFormats.Dib, false))
    {
        MemoryStream dib = retrievedData.GetData(DataFormats.Dib, false) as MemoryStream;
        if (dib != null)
            clipboardimage = ImageFromClipboardDib(dib.ToArray());
    }
    if (clipboardimage == null && retrievedData.GetDataPresent(DataFormats.Bitmap))
        clipboardimage = new Bitmap(retrievedData.GetData(DataFormats.Bitmap) as Image);
    if (clipboardimage == null && retrievedData.GetDataPresent(typeof(Image)))
        clipboardimage = new Bitmap(retrievedData.GetData(typeof(Image)) as Image);
    return clipboardimage;
}</code>
ログイン後にコピー

上記の方法を使用すると、開発者はクリップボード上の透明な画像を効率的に処理でき、透明度をサポートするアプリケーションで透明度を維持できます。

以上が透明性を維持したまま、透明な画像を Windows クリップボードにコピーして貼り付けるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート