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

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

Susan Sarandon
Susan Sarandonoriginal
2025-01-12 14:32:45834parcourir

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

Copier des images avec transparence : une solution de presse-papiers Windows

Problème : Préservation de la transparence de l'image lors de la copie dans le presse-papiers de Windows.

Contexte

Le presse-papiers Windows ne prend pas automatiquement en charge la transparence. Cependant, il peut gérer différents formats de données, dont PNG, qui supporte les canaux alpha (transparence).

Solution

Pour maintenir la transparence, utilisez cette stratégie :

Stockage de l'image

  1. Convertissez votre image en flux PNG à l'aide de MemoryStream et Image.Save().
  2. Convertissez-le également au format Device Independent Bitmap (DIB), largement accepté pour sa gestion de la transparence.
  3. Stockez les flux PNG et DIB, ainsi qu'un bitmap standard, dans un DataObject.

Récupération de l'image

  1. Accédez au DataObject depuis le presse-papiers.
  2. Donner la priorité à la récupération de l'image au format PNG ; s'il n'est pas disponible, essayez DIB ; puis revenez aux types Bitmap ou Image standard.
  3. Il est essentiel de créer un clone de l'image récupérée pour éviter les conflits de ressources et les plantages potentiels.

Mise en œuvre du code

<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>

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