Maison > développement back-end > C++ > Comment puis-je copier et coller des images transparentes dans le presse-papiers de Windows tout en préservant la transparence ?

Comment puis-je copier et coller des images transparentes dans le presse-papiers de Windows tout en préservant la transparence ?

Patricia Arquette
Libérer: 2025-01-12 14:39:44
original
342 Les gens l'ont consulté

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

Copier l'image transparente dans le presse-papiers

De nombreux développeurs rencontrent des difficultés à préserver la transparence lors de la copie d'images transparentes dans le presse-papiers. Par défaut, le presse-papiers Windows ne prend pas en charge la transparence.

Transparence dans les données du presse-papiers

Pour prendre en charge la transparence dans les données du presse-papiers, les images doivent être incluses dans plusieurs formats :

  1. PNG : un format d'image sans perte qui prend en charge la transparence et est largement accepté par la plupart des éditeurs et applications d'images.
  2. DIB (Device-Independent Bitmap)  : Un format ARGB couramment pris en charge par les applications comme ayant de la transparence, mais il n'est pas fiable et peut conduire à des résultats incohérents.
  3. Bitmap : format d'image standard qui ne prend pas en charge la transparence.

Copier l'image avec transparence

Pour copier une image en préservant la transparence, utilisez le code suivant :

<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>
Copier après la connexion

Obtenir l'image du presse-papiers

Pour récupérer une image du presse-papier, utilisez le code suivant :

<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>
Copier après la connexion

En utilisant la méthode ci-dessus, les développeurs peuvent gérer efficacement les images transparentes dans le presse-papiers, préservant ainsi la transparence dans les applications prenant en charge la transparence.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal