ホームページ > バックエンド開発 > C++ > 画像を Windows クリップボードにコピーするときに透明性を維持するにはどうすればよいですか?

画像を Windows クリップボードにコピーするときに透明性を維持するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-12 14:32:45
オリジナル
831 人が閲覧しました

How to Maintain Transparency When Copying Images to the Windows Clipboard?

透明性のある画像のコピー: Windows クリップボード ソリューション

問題: Windows クリップボードにコピーするときに画像の透明度が維持されます。

背景

Windows クリップボードは本質的に透明性をサポートしていません。 ただし、アルファ チャネル (透明度) をサポートする PNG など、さまざまなデータ形式を処理できます。

解決策

透明性を維持するには、次の戦略を採用してください:

画像の保存

  1. MemoryStreamImage.Save() を使用して画像を PNG ストリームに変換します。
  2. また、透明度の処理で広く受け入れられている Device Independent Bitmap (DIB) 形式に変換します。
  3. PNG ストリームと DIB ストリームの両方を、標準ビットマップとともに DataObject 内に保存します。

画像の取得

  1. クリップボードから DataObject にアクセスします。
  2. 画像を PNG として取得することを優先します。利用できない場合は、DIB を試してください。その後、標準のビットマップまたはイメージ タイプに戻ります。
  3. リソースの競合やクラッシュの可能性を避けるために、取得したイメージのクローンを作成することが重要です。

コードの実装

<code class="language-csharp">public static void SetClipboardImage(Bitmap image, Bitmap imageNoTr, DataObject data)
{
    Clipboard.Clear();
    data ??= new DataObject(); //Null-conditional operator for brevity

    imageNoTr ??= image; //Null-conditional operator for brevity

    using (MemoryStream pngMemStream = new MemoryStream())
    using (MemoryStream dibMemStream = new MemoryStream())
    {
        data.SetData(DataFormats.Bitmap, true, imageNoTr);
        image.Save(pngMemStream, ImageFormat.Png);
        data.SetData("PNG", false, pngMemStream);

        byte[] dibData = ConvertToDib(image);
        dibMemStream.Write(dibData, 0, dibData.Length);
        data.SetData(DataFormats.Dib, false, dibMemStream);
        Clipboard.SetDataObject(data, true);
    }
}

public static Bitmap GetClipboardImage(DataObject retrievedData)
{
    Bitmap clipboardimage = null;

    if (retrievedData.GetDataPresent("PNG", false))
    {
        MemoryStream pngStream = retrievedData.GetData("PNG", false) as MemoryStream;
        using (Bitmap bm = new Bitmap(pngStream))
            clipboardimage = ImageUtils.CloneImage(bm);
    }
    else if (retrievedData.GetDataPresent(DataFormats.Dib, false))
    {
        MemoryStream dib = retrievedData.GetData(DataFormats.Dib, false) as MemoryStream;
        clipboardimage = dib != null ? ImageFromClipboardDib(dib.ToArray()) : null;
    }
    else if (retrievedData.GetDataPresent(DataFormats.Bitmap))
    {
        clipboardimage = new Bitmap(retrievedData.GetData(DataFormats.Bitmap) as Image);
    }
    else if (retrievedData.GetDataPresent(typeof(Image)))
    {
        clipboardimage = new Bitmap(retrievedData.GetData(typeof(Image)) as Image);
    }

    return clipboardimage;
}</code>
ログイン後にコピー

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

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