


Reliable copy-paste of transparent images in different applications
You may have encountered an issue where when you copy and paste an image, the transparency does not remain consistent across different programs. Although Chrome can preserve transparency, it may be lost when an image is set using the system clipboard object.
Clipboard Limitation
The Windows Clipboard does not natively support image transparency. However, you can leverage multiple data types to increase compatibility across applications.
PNG streaming: best compatibility option
PNG streaming is the most reliable way to maintain transparency of clipboard images. Paste the PNG image into GIMP or newer MS Office programs and the transparency will be preserved.
Multiple formats, wider compatibility
To ensure compatibility with more applications, it is recommended to include multiple supported image formats on the clipboard, such as PNG, Device Independent Bitmap (DIB) and standard bitmap.
Sample code
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; } }
Extract image from clipboard
To extract an image from the clipboard, you need to check the various supported formats, preferring PNG to ensure maximum reliability:
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) ... }
(Note: ImageUtils.GetImageData
, ImageUtils.CloneImage
and ImageUtils.BuildImage
in the above code snippet need to be implemented by yourself according to the actual situation.) These functions are responsible for the processing of image data and the creation of bitmaps. The implementation of this part depends on the image processing library you use and the specific platform environment.
The above is the detailed content of How Can I Reliably Copy and Paste Images with Transparency in Different Applications?. For more information, please follow other related articles on the PHP Chinese website!

This article explains the C Standard Template Library (STL), focusing on its core components: containers, iterators, algorithms, and functors. It details how these interact to enable generic programming, improving code efficiency and readability t

This article details efficient STL algorithm usage in C . It emphasizes data structure choice (vectors vs. lists), algorithm complexity analysis (e.g., std::sort vs. std::partial_sort), iterator usage, and parallel execution. Common pitfalls like

The article discusses dynamic dispatch in C , its performance costs, and optimization strategies. It highlights scenarios where dynamic dispatch impacts performance and compares it with static dispatch, emphasizing trade-offs between performance and

C 20 ranges enhance data manipulation with expressiveness, composability, and efficiency. They simplify complex transformations and integrate into existing codebases for better performance and maintainability.

This article details effective exception handling in C , covering try, catch, and throw mechanics. It emphasizes best practices like RAII, avoiding unnecessary catch blocks, and logging exceptions for robust code. The article also addresses perf

The article discusses using move semantics in C to enhance performance by avoiding unnecessary copying. It covers implementing move constructors and assignment operators, using std::move, and identifies key scenarios and pitfalls for effective appl

Article discusses effective use of rvalue references in C for move semantics, perfect forwarding, and resource management, highlighting best practices and performance improvements.(159 characters)

C memory management uses new, delete, and smart pointers. The article discusses manual vs. automated management and how smart pointers prevent memory leaks.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Dreamweaver CS6
Visual web development tools

WebStorm Mac version
Useful JavaScript development tools

Notepad++7.3.1
Easy-to-use and free code editor

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

Atom editor mac version download
The most popular open source editor
