Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menyalin dan Menampal Imej Lutsinar pada Papan Klip Windows Sambil Memelihara Ketelusan?

Bagaimanakah Saya Boleh Menyalin dan Menampal Imej Lutsinar pada Papan Klip Windows Sambil Memelihara Ketelusan?

Patricia Arquette
Patricia Arquetteasal
2025-01-12 14:39:44381semak imbas

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

Salin imej lutsinar ke papan keratan

Ramai pembangun menghadapi kesukaran untuk mengekalkan ketelusan apabila menyalin imej lutsinar ke papan keratan. Secara lalai, papan keratan Windows tidak menyokong ketelusan.

Ketelusan dalam data papan keratan

Untuk menyokong ketelusan dalam data papan keratan, imej perlu disertakan dalam berbilang format:

  1. PNG: Format imej tanpa kerugian yang menyokong ketelusan dan diterima secara meluas oleh kebanyakan editor dan aplikasi imej.
  2. DIB (Peta Bit Bebas Peranti) : Format ARGB yang biasanya disokong oleh aplikasi sebagai mempunyai ketelusan, tetapi ia tidak boleh dipercayai dan boleh membawa kepada hasil yang tidak konsisten.
  3. Bitmap: Format imej standard yang tidak menyokong ketelusan.

Salin imej dengan ketelusan

Untuk menyalin imej yang mengekalkan ketelusan, gunakan kod berikut:

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

Dapatkan imej daripada papan keratan

Untuk mendapatkan semula imej daripada papan keratan, gunakan kod berikut:

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

Dengan menggunakan kaedah di atas, pembangun boleh mengendalikan imej lutsinar pada papan keratan dengan cekap, memelihara ketelusan dalam aplikasi yang menyokong ketelusan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyalin dan Menampal Imej Lutsinar pada Papan Klip Windows Sambil Memelihara Ketelusan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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