Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengekalkan Ketelusan Semasa Menyalin Imej ke Papan Klip Windows?

Bagaimana untuk Mengekalkan Ketelusan Semasa Menyalin Imej ke Papan Klip Windows?

Susan Sarandon
Lepaskan: 2025-01-12 14:32:45
asal
831 orang telah melayarinya

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

Menyalin Imej dengan Ketelusan: Penyelesaian Papan Klip Windows

Masalah: Memelihara ketelusan imej semasa menyalin ke papan keratan Windows.

Latar belakang

Papan keratan Windows sememangnya tidak menyokong ketelusan. Walau bagaimanapun, ia boleh mengendalikan pelbagai format data, termasuk PNG, yang memang menyokong saluran alfa (ketelusan).

Penyelesaian

Untuk mengekalkan ketelusan, gunakan strategi ini:

Menyimpan Imej

  1. Tukar imej anda kepada strim PNG menggunakan MemoryStream dan Image.Save().
  2. Tukarkan juga kepada format Peta Bit Bebas Peranti (DIB), diterima secara meluas untuk pengendalian ketelusannya.
  3. Simpan kedua-dua strim PNG dan DIB, bersama-sama dengan peta bit standard, dalam DataObject.

Mengambil semula Imej

  1. Akses DataObject daripada papan keratan.
  2. Utamakan mendapatkan semula imej sebagai PNG; jika tidak tersedia, cuba DIB; kemudian kembali kepada jenis Peta Bit atau Imej standard.
  3. Yang penting, buat klon imej yang diambil untuk mengelakkan konflik sumber dan kemungkinan ranap.

Pelaksanaan Kod

<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>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Ketelusan Semasa Menyalin Imej ke Papan Klip Windows?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan