Maison >développement back-end >C++ >Comment préserver la transparence lors de la copie d'images dans le presse-papiers de Windows ?

Comment préserver la transparence lors de la copie d'images dans le presse-papiers de Windows ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-12 14:55:44205parcourir

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

Comment conserver la transparence lors de la copie d'une image dans le presse-papiers

Problème : Lors de la copie d'une image PNG transparente dans le presse-papiers, la transparence est souvent perdue.

Raison :

  • Le presse-papiers Windows ne prend pas en charge nativement la transparence.
  • Un format spécifique appelé Device-Independent Bitmap (DIB) est couramment utilisé dans le presse-papiers, mais il présente des limites en matière de gestion de la transparence.

Solution :

  • Utiliser plusieurs formats de données :
<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 pngMemoryStream = new MemoryStream())
    using (MemoryStream dibMemoryStream = new MemoryStream())
    {
        // 将图像以PNG、DIB和标准位图格式放入剪贴板
        ... (代码省略,篇幅所限)

        Clipboard.SetDataObject(data, true);
    }
}</code>
  • Convertir les images dans un format plus fiable :

Le moyen le plus fiable de mettre une image avec prise en charge de la transparence dans le presse-papiers est d'utiliser le streaming PNG.

<code class="language-c#">byte[] bm32bData = ImageUtils.GetImageData(bm32b, out stride);
// PNG格式的线条是反向的。
bm32b.RotateFlip(RotateFlipType.Rotate180FlipX);
data.SetData("PNG", false, pngMemoryStream);</code>
  • Gérer différents formats de données :

Lors de la récupération d'images du presse-papiers, vérifiez les différents formats de données dans cet ordre : PNG, DIB, Bitmap, Image.

<code class="language-c#">public static Bitmap GetClipboardImage(DataObject retrievedData)
{
    Bitmap clipboardimage = null;
    // 顺序:尝试PNG,然后尝试32位ARGB DIB,再尝试普通的位图和图像类型。
    ... (代码省略,篇幅所限)

    return clipboardimage;
}</code>
  • Convertir en DIB à l'aide d'un code personnalisé :
<code class="language-c#">public static Bitmap ImageFromClipboardDib(Byte[] dibBytes)
{
    if (dibBytes == null || dibBytes.Length </code>

En adoptant ces méthodes, vous pouvez gérer la transparence de l'image plus efficacement et éviter de perdre les informations de transparence lors de la copie dans le presse-papiers.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn