将PNG图片内容复制到剪贴板的函数实现

2星 需积分: 1 86 下载量 68 浏览量 更新于2024-09-09 收藏 2KB TXT 举报
"该代码段提供了一个函数`intCopyFileToClipboard(char*szFileName)`,用于将PNG图片内容复制到剪贴板。这种方法不同于通常复制文件到剪贴板,而是直接复制图片内容,使其可以在支持剪贴板图像粘贴的应用程序中使用。" 在Windows操作系统中,剪贴板是一个共享内存区域,用于在应用程序之间临时存储数据。这个函数的核心功能是将PNG图片转换成剪贴板可以理解的数据格式,并将其存储在剪贴板上。 首先,函数通过`cvLoadImage(szFileName, CV_LOAD_IMAGE_UNCHANGED)`使用OpenCV库加载PNG图片。如果图片加载失败,函数返回0。OpenCV是一个强大的计算机视觉库,它提供了读取、处理和显示图像的功能。 接下来,函数创建一个`BITMAPINFOHEADER`结构体来描述图像的属性,如宽度、高度、位深度、压缩方式等。`BITMAPINFOHEADER`是Windows GDI(图形设备接口)中用于定义位图信息的结构。在这个例子中,`biWidth`和`biHeight`分别设置为图片的宽度和高度,`biBitCount`表示每个像素的位数,`biCompression`设置为`BI_RGB`,意味着没有压缩,`biSizeImage`设置为图像的实际大小,其他字段根据需要进行初始化。 然后,函数注册了一个名为"PreferredDropEffect"的剪贴板格式,这个格式通常与拖放操作相关,用于指定允许的拖放效果。注册成功后,函数使用`GlobalAlloc`分配内存来存储`BITMAPINFO`结构体和图像数据。`GMEM_ZEROINIT`、`GMEM_MOVEABLE`和`GMEM_DDESHARE`标志分别表示内存初始化为零、数据可移动以及支持DDE(动态数据交换)。 最后,函数将填充好的`BITMAPINFO`结构体和图像数据写入分配的内存中,并尝试将内存句柄复制到剪贴板。如果一切顺利,剪贴板现在包含了PNG图片的内容,用户就可以在支持剪贴板图像的任何应用程序中粘贴该图片。 这个函数对于在各种应用程序之间传递图像数据非常有用,例如在设计软件、图像编辑器或演示文稿软件中。然而,需要注意的是,这个函数没有错误处理和资源释放部分,实际使用时应确保正确处理可能出现的错误,并在完成后释放内存。
2009-09-18 上传
procedure BitmapFileToPNG(const Source, Dest: String); var Bitmap: TBitmap; PNG: TPNGObject; begin Bitmap := TBitmap.Create; PNG := TPNGObject.Create; {In case something goes wrong, free booth Bitmap and PNG} try Bitmap.LoadFromFile(Source); PNG.Assign(Bitmap); //Convert data into png PNG.SaveToFile(Dest); finally Bitmap.Free; PNG.Free; end end; Converting from PNG file to Windows bitmap file The above inverse. Loads a png and saves into a bitmap procedure PNGFileToBitmap(const Source, Dest: String); var Bitmap: TBitmap; PNG: TPNGObject; begin PNG := TPNGObject.Create; Bitmap := TBitmap.Create; {In case something goes wrong, free booth PNG and Bitmap} try PNG.LoadFromFile(Source); Bitmap.Assign(PNG); //Convert data into bitmap Bitmap.SaveToFile(Dest); finally PNG.Free; Bitmap.Free; end end; Converting from TImage to PNG file This method converts from TImage to PNG. It has full exception handling and allows converting from file formats other than TBitmap (since they allow assigning to a TBitmap) procedure TImageToPNG(Source: TImage; const Dest: String); var PNG: TPNGObject; BMP: TBitmap; begin PNG := TPNGObject.Create; {In case something goes wrong, free PNG} try //If the TImage contains a TBitmap, just assign from it if Source.Picture.Graphic is TBitmap then PNG.Assign(TBitmap(Source.Picture.Graphic)) //Convert bitmap data into png else begin //Otherwise try to assign first to a TBimap BMP := TBitmap.Create; try BMP.Assign(Source.Picture.Graphic); PNG.Assign(BMP); finally BMP.Free; end; end; //Save to PNG format PNG.SaveToFile(Dest); finally PNG.Free; end end;