Rumah pembangunan bahagian belakang C++ Bagaimanakah Saya Boleh Menyalin dan Menampal Imej dengan Ketelusan dalam Aplikasi Berbeza?

Bagaimanakah Saya Boleh Menyalin dan Menampal Imej dengan Ketelusan dalam Aplikasi Berbeza?

Jan 12, 2025 pm 02:34 PM

How Can I Reliably Copy and Paste Images with Transparency in Different Applications?

Salin-tampal imej lutsinar yang boleh dipercayai dalam aplikasi berbeza

Anda mungkin menghadapi masalah apabila anda menyalin dan menampal imej, ketelusan tidak kekal konsisten merentas program yang berbeza. Walaupun Chrome boleh mengekalkan ketelusan, ia mungkin hilang apabila imej ditetapkan menggunakan objek papan keratan sistem.

Had Papan Klip

Papan Klip Windows tidak menyokong ketelusan imej secara asli. Walau bagaimanapun, anda boleh memanfaatkan berbilang jenis data untuk meningkatkan keserasian merentas aplikasi.

Penstriman PNG: pilihan keserasian terbaik

Penstriman PNG ialah cara yang paling boleh dipercayai untuk mengekalkan ketelusan imej papan keratan. Tampalkan imej PNG ke dalam GIMP atau program MS Office yang lebih baharu dan ketelusan akan terpelihara.

Berbilang format, keserasian yang lebih luas

Untuk memastikan keserasian dengan lebih banyak aplikasi, adalah disyorkan untuk memasukkan berbilang format imej yang disokong pada papan keratan, seperti PNG, Peta Bit Bebas Peranti (DIB) dan peta bit standard.

Kod sampel

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); // 设置标准位图(无透明度)
        image.Save(pngMemStream, ImageFormat.Png);
        data.SetData("PNG", false, pngMemStream); // 设置PNG流(GIMP和较新MS Office兼容)
        Byte[] dibData = ConvertToDib(image);
        dibMemStream.Write(dibData, 0, dibData.Length);
        data.SetData(DataFormats.Dib, false, dibMemStream); // 设置DIB格式(处理错误解释透明度的应用)
        Clipboard.SetDataObject(data, true);
    }
}

public static Byte[] ConvertToDib(Image image)
{
    using (Bitmap bm32b = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppArgb))
    {
        using (Graphics gr = Graphics.FromImage(bm32b))
            gr.DrawImage(image, new Rectangle(0, 0, bm32b.Width, bm32b.Height));
        bm32b.RotateFlip(RotateFlipType.Rotate180FlipX);
        Int32 stride;
        Byte[] bm32bData = ImageUtils.GetImageData(bm32b, out stride);
        Int32 hdrSize = 0x28;
        Byte[] fullImage = new Byte[hdrSize + 12 + bm32bData.Length];
        ArrayUtils.WriteIntToByteArray(fullImage, 0x00, 4, true, (UInt32)hdrSize);
        ArrayUtils.WriteIntToByteArray(fullImage, 0x04, 4, true, (UInt32)image.Width);
        ArrayUtils.WriteIntToByteArray(fullImage, 0x08, 4, true, (UInt32)image.Height);
        ArrayUtils.WriteIntToByteArray(fullImage, 0x0C, 2, true, 1);
        ArrayUtils.WriteIntToByteArray(fullImage, 0x0E, 2, true, 32);
        ArrayUtils.WriteIntToByteArray(fullImage, 0x10, 4, true, 3);
        ArrayUtils.WriteIntToByteArray(fullImage, 0x14, 4, true, (UInt32)bm32bData.Length);
        ArrayUtils.WriteIntToByteArray(fullImage, hdrSize + 0, 4, true, 0x00FF0000);
        ArrayUtils.WriteIntToByteArray(fullImage, hdrSize + 4, 4, true, 0x0000FF00);
        ArrayUtils.WriteIntToByteArray(fullImage, hdrSize + 8, 4, true, 0x000000FF);
        Array.Copy(bm32bData, 0, fullImage, hdrSize + 12, bm32bData.Length);
        return fullImage;
    }
}
Salin selepas log masuk

Ekstrak imej daripada papan keratan

Untuk mengekstrak imej daripada papan keratan, anda perlu menyemak pelbagai format yang disokong, memilih PNG untuk memastikan kebolehpercayaan maksimum:

public static Bitmap GetClipboardImage(DataObject retrievedData)
{
    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))
                return ImageUtils.CloneImage(bm);
    }
    else if (retrievedData.GetDataPresent(DataFormats.Dib, false))
    {
        MemoryStream dib = retrievedData.GetData(DataFormats.Dib, false) as MemoryStream;
        if (dib != null)
            return ImageFromClipboardDib(dib.ToArray());
    }
    else if (retrievedData.GetDataPresent(DataFormats.Bitmap))
        return new Bitmap(retrievedData.GetData(DataFormats.Bitmap) as Image);
    else if (retrievedData.GetDataPresent(typeof(Image)))
        return new Bitmap(retrievedData.GetData(typeof(Image)) as Image);
    return null;
}

public static Bitmap ImageFromClipboardDib(Byte[] dibBytes)
{
    if (dibBytes == null || dibBytes.Length < 4 || dibBytes.Length < (Int32)ArrayUtils.ReadIntFromByteArray(dibBytes, 0, 4, true))
        return null;
    Int32 width = (Int32)ArrayUtils.ReadIntFromByteArray(dibBytes, 0x04, 4, true);
    Int32 height = (Int32)ArrayUtils.ReadIntFromByteArray(dibBytes, 0x08, 4, true);
    Int16 planes = (Int16)ArrayUtils.ReadIntFromByteArray(dibBytes, 0x0C, 2, true);
    Int16 bitCount = (Int16)ArrayUtils.ReadIntFromByteArray(dibBytes, 0x0E, 2, true);
    Int32 compression = (Int32)ArrayUtils.ReadIntFromByteArray(dibBytes, 0x10, 4, true);
    if (planes != 1 || (compression != 0 && compression != 3))
        return null;
    PixelFormat fmt;
    switch (bitCount)
    {
        case 32: fmt = PixelFormat.Format32bppRgb; break;
        case 24: fmt = PixelFormat.Format24bppRgb; break;
        case 16: fmt = PixelFormat.Format16bppRgb555; break;
        default: return null;
    }
    Int32 stride = (((((bitCount * width) + 7) / 8) + 3) / 4) * 4;
    Int32 imageIndex = 40 + (compression == 3 ? 12 : 0);
    if (dibBytes.Length < imageIndex) return null;
    Byte[] image = new Byte[dibBytes.Length - imageIndex];
    Array.Copy(dibBytes, imageIndex, image, 0, image.Length);
    Bitmap bitmap = ImageUtils.BuildImage(image, width, height, stride, fmt, null, null);

    // ... (ImageFromClipboardDib function continues,  requires ImageUtils.BuildImage implementation) ...
}
Salin selepas log masuk

(Nota: ImageUtils.GetImageData, ImageUtils.CloneImage dan ImageUtils.BuildImage dalam coretan kod di atas perlu dilaksanakan sendiri mengikut situasi sebenar.) Fungsi ini bertanggungjawab untuk pemprosesan imej data dan penciptaan peta bit. Pelaksanaan bahagian ini bergantung pada perpustakaan pemprosesan imej yang anda gunakan dan persekitaran platform tertentu.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyalin dan Menampal Imej dengan Ketelusan dalam Aplikasi Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan? Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan? Mar 03, 2025 pm 05:52 PM

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan?

Gulc: Perpustakaan C dibina dari awal Gulc: Perpustakaan C dibina dari awal Mar 03, 2025 pm 05:46 PM

Gulc: Perpustakaan C dibina dari awal

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes Langkah Format Fungsi Fungsi C Langkah Penukaran Kes Mar 03, 2025 pm 05:53 PM

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes

Penggunaan dan perkongsian frasa yang berbeza Penggunaan dan perkongsian frasa yang berbeza Mar 03, 2025 pm 05:51 PM

Penggunaan dan perkongsian frasa yang berbeza

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan? Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan? Mar 03, 2025 pm 05:51 PM

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan?

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu Mar 03, 2025 pm 05:53 PM

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Mar 12, 2025 pm 04:50 PM

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi?

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap? Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap? Mar 12, 2025 pm 04:52 PM

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap?

See all articles