Heim >Backend-Entwicklung >C++ >Wie bleibt die Transparenz beim Kopieren von Bildern in die Windows-Zwischenablage erhalten?

Wie bleibt die Transparenz beim Kopieren von Bildern in die Windows-Zwischenablage erhalten?

Susan Sarandon
Susan SarandonOriginal
2025-01-12 14:32:45834Durchsuche

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

Bilder mit Transparenz kopieren: Eine Lösung für die Windows-Zwischenablage

Problem:Beim Kopieren in die Windows-Zwischenablage bleibt die Bildtransparenz erhalten.

Hintergrund

Die Windows-Zwischenablage unterstützt grundsätzlich keine Transparenz. Es kann jedoch verschiedene Datenformate verarbeiten, einschließlich PNG, das nicht Alphakanäle (Transparenz) unterstützt.

Lösung

Um die Transparenz aufrechtzuerhalten, wenden Sie diese Strategie an:

Speichern des Bildes

  1. Konvertieren Sie Ihr Bild mit MemoryStream und Image.Save() in einen PNG-Stream.
  2. Konvertieren Sie es auch in das Device Independent Bitmap (DIB)-Format, das wegen seiner Transparenzverarbeitung weithin anerkannt ist.
  3. Speichern Sie sowohl die PNG- als auch die DIB-Streams zusammen mit einer Standard-Bitmap in einem DataObject.

Bild abrufen

  1. Greifen Sie über die Zwischenablage auf DataObject zu.
  2. Priorisieren Sie den Abruf des Bildes als PNG; Wenn nicht verfügbar, versuchen Sie es mit DIB. Greifen Sie dann auf Standard-Bitmap- oder Bildtypen zurück.
  3. Erstellen Sie unbedingt einen Klon des abgerufenen Bildes, um Ressourcenkonflikte und mögliche Abstürze zu vermeiden.

Code-Implementierung

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

Das obige ist der detaillierte Inhalt vonWie bleibt die Transparenz beim Kopieren von Bildern in die Windows-Zwischenablage erhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn