社区首页 >问答首页 >Win32剪贴板和alpha通道图像

Win32剪贴板和alpha通道图像
EN

Stack Overflow用户
提问于 2013-03-28 18:30:09
回答 2查看 4.3K关注 0票数 10

我的应用程序应该能够将32位图像(RGB + alpha通道)复制到剪贴板,并从剪贴板粘贴这些图像。为此,我计划使用CF_DIBV5,因为BITMAPV5HEADER结构有一个字段bV5AlphaMask

问题是,对于如何准确地将图像数据存储在剪贴板中,似乎没有达成共识。在做一些测试时,我发现应用程序之间存在一些差异,这使得提出一个通用的解决方案几乎是不可能的。

以下是我的观察结果:

  1. 当我从Word 2010或XnView复制alpha通道图像到剪贴板时,它是在没有预乘像素数据的情况下存储的。
  2. 当我使用Firefox或Chrome复制图像时,像素数据似乎被alpha channel.
  3. Firefox预乘了设置为0xff000000,而大多数其他应用程序根本不设置它,而是将其保留为0。这很奇怪,因为这些应用程序将DIB放到剪贴板上,这些剪贴板实际上包含最高8位的alpha通道,但它们仍然将bV5AlphaMask设置为0。因此,我们必须假设,如果位深度为32,则即使bV5AlphaMask为0,也存在alpha通道。

简而言之,我的基本问题是:关于如何将alpha通道数据存储在剪贴板上,是否有一些官方信息?我特别感兴趣的是,数据是否必须进行预乘。正如你在上面看到的,Word2010和XnView不是预乘,而火狐和Chrome是预乘。但重要的是要知道颜色通道是否应该被预乘。

非常感谢你对此给予了一些启发!

UPDATE 2粘贴到Paint.NET现在可以正常工作。这是由我的代码中的一个错误引起的,如果alpha通道为0,则没有将颜色通道设置为0,即在这种情况下预乘没有正确完成,这似乎混淆了Paint.NET。

IE 10在复制带有alpha通道的PNG到剪贴板时,只是在剪贴板上放了一个24位的CF_DIBV5,但是Paint.NET可以粘贴这个带有alpha通道的位图,所以IE 10必须有另一种格式暴露给剪贴板。也许它暴露了一个使用CFSTR_FILECONTENTS和CFSTR_FILEDESCRIPTOR的PNG。

更新我现在已经用下面的arx描述的方式实现了它,它工作得很好。然而,仍然有两件事让我感到困惑:

1)将alpha通道图像从我的应用程序粘贴到Paint.NET中不会保留alpha通道。图片在Paint.NET中看起来是不透明的。但是,从火狐和Chrome粘贴到Paint.NET效果很好,alpha通道被保留了下来!我已经丢弃了完整的DIBV5,它和我的应用程序是一样的,但它仍然可以与FF和Chrome一起工作,但不能与我的应用程序一起工作,所以它肯定还有其他东西!Firefox和Chrome肯定在做我的应用不能做的其他事情!?

2) Internet Explorer 10也是如此。从IE 10粘贴alpha通道图像到我的应用程序根本不起作用……我得到了一个位深度为24的DIB,也就是说根本没有alpha通道。然而,当从IE 10粘贴到Paint.NET时,alpha通道就在那里!所以这里一定还有更多的东西...

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-28 19:56:41

我确信在CF_DIBV5中存储alpha的方法是正确的,但这真的无关紧要。应用程序已经不一致地处理它,所以如果你想让你的应用程序很好地与其他应用程序配合使用,你就不能使用CF_DIBV5。

前段时间我研究了复制和粘贴透明位图。我的目标是成功地将透明位图粘贴到Office和GIMP的两个版本中。我研究了几种可能的格式:

CF_BITMAP

透明度始终被忽略。

CF_DIB

使用通常0xAARRGGBB格式的32bpp BI_RGB。GIMP支持这一点,但其他的都不支持。

CF_DIBV5

GIMP不支持这一点。

"PNG"

支持粘贴: GIMP、Word 2000、Excel2000、Excel2007和PowerPoint 2007。

不支持粘贴: Word 2007和OneNote 2007。

如果您复制位图,所有这些应用程序都会成功导出"PNG“。

但是,Word和OneNote 2007将粘贴从资源管理器复制的OneNote文件。因此,我想出了以下几点:

复制的解决方案

将透明位图转换为PNG格式。

通告以下剪贴板格式:

" PNG " -原始PNG数据。

CF_DIB -适用于不处理透明度的应用程序(如画图)。

CFSTR_FILEDESCRIPTOR -使PNG看起来像一个文件。文件描述符应该有一个虚构的文件名,扩展名为".png“。

CFSTR_FILECONTENTS -内容必须公开为IStream;仅使用HGLOBAL似乎行不通。数据与"PNG“数据相同。

完成此操作后,我可以成功地将透明位图粘贴到GIMP、Office2000和Office2007中。也可以将PNG直接粘贴到资源管理器文件夹中。

更新

我意识到我只回答了问题的一半。这对于复制非常有用,但是如果你想从一个只复制CF_DIBV5的应用程序(比如火狐)中粘贴,那就没用了。

我建议你使用"PNG“,如果它是可用的,否则退回到CF_DIBV5,将其视为预乘。这将正确处理Word 2010 (导出"PNG")、Firefox和Chrome。XnView仅导出未相乘的CF_DIBV5,因此无法正常工作。我不确定你能做得更好。

lscf -一个探索剪贴板格式的工具

这是用于显示可用剪贴板格式列表的工具的源代码。它还可以将一个文件写入文件。我管它叫lscf。在Visual Studio中创建一个win32控制台应用程序,并将此源代码粘贴到main函数上。它有一个非常小的错误:如果您输入了错误的格式名称,它永远不会显示“未知格式”错误。

代码语言:javascript
代码运行次数:0
复制
#include <Windows.h>

#include <stdio.h>
#include <tchar.h>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))

LPCTSTR cfNames[] = {
    _T("CF_TEXT"),
    _T("CF_BITMAP"),
    _T("CF_METAFILEPICT"),
    _T("CF_SYLK"),
    _T("CF_DIF"),
    _T("CF_TIFF"),
    _T("CF_OEMTEXT"),
    _T("CF_DIB"),
    _T("CF_PALETTE"),
    _T("CF_PENDATA"),
    _T("CF_RIFF"),
    _T("CF_WAVE"),
    _T("CF_UNICODETEXT"),
    _T("CF_ENHMETAFILE"),
    _T("CF_HDROP"),
    _T("CF_LOCALE"),
    _T("CF_DIBV5")
};

int LookupFormat(LPCTSTR name)
{
    for (int i = 0; i != ARRAY_SIZE(cfNames); ++i)
    {
        if (_tcscmp(cfNames[i], name) == 0)
            return i + 1;
    }

    return RegisterClipboardFormat(name);
}

void PrintFormatName(int format)
{
    if (!format)
        return;

    if ((format > 0) && (format <= ARRAY_SIZE(cfNames)))
    {
        _tprintf(_T("%s\n"), cfNames[format - 1]);
    }
    else
    {
        TCHAR buffer[100];

        if (GetClipboardFormatName(format, buffer, ARRAY_SIZE(buffer)))
            _tprintf(_T("%s\n"), buffer);
        else
            _tprintf(_T("#%i\n"), format);
    }
}

void WriteFormats()
{
    int count = 0;
    int format = 0;
    do
    {
        format = EnumClipboardFormats(format);
        if (format)
        {
            ++count;
            PrintFormatName(format);
        }
    }
    while (format != 0);

    if (!count)
        _tprintf(_T("Clipboard is empty!\n"));
}

void SaveFormat(int format, LPCTSTR filename)
{
    HGLOBAL hData = (HGLOBAL)GetClipboardData(format);

    LPVOID data = GlobalLock(hData);

    HANDLE hFile = CreateFile(filename, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        DWORD bytesWritten;
        WriteFile(hFile, data, GlobalSize(hData), &bytesWritten, 0);
        CloseHandle(hFile);
    }

    GlobalUnlock(hData);
}

int _tmain(int argc, _TCHAR* argv[])
{
    if (!OpenClipboard(0))
    {
        _tprintf(_T("Cannot open clipboard\n"));
        return 1;
    }

    if (argc == 1)
    {
        WriteFormats();
    }
    else if (argc == 3)
    {
        int format = LookupFormat(argv[1]);
        if (format == 0)
        {
            _tprintf(_T("Unknown format\n"));
            return 1;
        }

        SaveFormat(format, argv[2]);
    }
    else
    {
        _tprintf(_T("lscf\n"));
        _tprintf(_T("List available clipboard formats\n\n"));
        _tprintf(_T("lscf CF_NAME filename\n"));
        _tprintf(_T("Write format CF_NAME to file filename\n\n"));
    }

    CloseClipboard();

    return 0;
}
票数 20
EN

Stack Overflow用户

发布于 2018-08-30 00:55:46

尽管有详细的主要答案,我还是被这个问题卡住了一段时间。它似乎不能保留alpha (即使是通过剪贴板查看器)。

事实证明,解决方案就像这样简单:

  1. 导出CF_DIB (不需要V5)与32位预乘alpha
  2. and一起导出"PNG"格式,它似乎能够粘贴到我测试的所有应用程序中(Paint.NET、GIMP、LibreOffice等)。

基本上,只要alpha被预乘,我使用的几乎每个程序都会将alpha保存在CF_DIB中。在一种罕见的一次性情况下,需要"PNG"

需要说明的是:不需要CF_DIBV5

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15689541

复制
相关文章
带alpha透明通道视频—网页播放带alpha通道视频叠加合成方案
带alpha通道的图片有GIF和PNG,但是GIF只有8位,失真严重,边缘锯齿非常明显。
周陆军
2020/01/22
4.2K1
Alpha通道的概念与功能
Alpha通道技术是非曲直图像合成的最基本技术,目前其应用多局限于多媒体课件作品开发中的个别环节,未能从整体上给予Alpha通道功能以足够的重视。如:对通用图像处理软件PHOTOSHOP中的Alpha通道及其运用有较深刻的理解,而疏忽了Alpha通道在动画、视频和多媒体集成工具中的应用。本文通过对Alpha通道的综合分析,以期使Alpha通道技术在多媒体课件作品开发中的应用形成一个相对完整的理论体系,并在多媒体课件作品开发实践中起到具体的指导作用。 一、Alpha通道的概念与功能 在计算机图形学中,一个RGB颜色模型的真彩图形,用由红、绿、蓝三个色彩信息通道合成的,每个通道用了8位色彩深度,共计24位,包含了所有彩色信息。为实现图形的透明效果,采取在图形文件的处理与存储中附加上另一个8位信息的方法,这个附加的代表图形中各个素点透明度的通道信息就被叫做Alpha通道。 Alpha通道使用8位二进制数,就可以表示256级灰度,即256级的透明度。白色(值为255)的Alpha像素用以定义不透明的彩色像素,而黑色(值为0)的Alpha通道像素用以定义透明像素,介于黑白之间的灰度(值为30-255)的Alpha像素用以定义不同程度的半透明像素。因而通过一个32位总线的图形卡来显示带Alpha通道的图形,就可能呈现出透明或半透明的视觉效果。 一个透明或半透明图形的数学模型应当如下: 为了便于下面的分析,设Alpha值[0,255]区间映射为[0,1]区间相对应的值表示,即Alpha值为0—1之间的数值。则图形文件中各个像素点可表示为: Graphx(Redx,Greenx,Bulex,Alphax) 屏幕上相应像素点的显示值就转换为: Dispx(Redx*Alphax,Greenx*Alphax,Bluex*Alphax) Alpha通道不仅用于单个图形的透明或半透明显示,更重要的是在图像合成中被广泛运用。 下面是如何根据Alpha通道数据进行图像混合的算法: 事实上,我们把需要组合的颜色计算出不含Alpha分量的原始RGB分量然后相加便可。如:两幅图像分别为A和B,由这两幅图像组合而成的图像称为C,则可用如下四元组表示图A和B,三元组表示图像C: A:(Ra,Ga,Ba,Alphaa) B:(Rb,Gb,Bb,Alphab) C:(Rc,Gc,Bc) 根据上述算法,则: Rc=Ra*Alphaa+Rb*Alphab Gc=Ga*Alphaa+Gb*Alphab Bc=Ba*Alphaa+Bb*Alphab 这就是两图像混合后的三原色分量。如果有多幅图像需要混合,则按照以上方法两幅两幅地进行混合。 Alpha通道技术是非曲直图像合成的最基本技术,目前其应用多局限于多媒体课件作品开发中的个别环节,未能从整体上给予Alpha通道功能以足够的重视。如:对通用图像处理软件PHOTOSHOP中的Alpha通道及其运用有较深刻的理解,而疏忽了Alpha通道在动画、视频和多媒体集成工具中的应用。本文通过对Alpha通道的综合分析,以期使Alpha通道技术在多媒体课件作品开发中的应用形成一个相对完整的理论体系,并在多媒体课件作品开发实践中起到具体的指导作用。
用户4766018
2022/08/19
1K0
图像处理——alpha融合
其中a为混合透明度取值范围[0,1]之间, RGB3为目标像素值, RGB1与RGB2的值分别来自两张不同的图像。
瓜大三哥
2018/07/30
2.2K0
图像处理——alpha融合
使用alpha混合将图像分层和图像抗锯齿。
import matplotlib.pyplot as plt import numpy as np methods = [None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', 'bessel', 'mitchell',
裴来凡
2022/05/28
1.2K0
使用alpha混合将图像分层和图像抗锯齿。
Itunes Connect 如添加图片(图像不能包含alpha通道或者透明度)
Itunes Connect 添加图片的时候,提示我们: "图像不能包含alpha通道或者透明度"
GuangdongQi
2018/09/13
9900
暗通道算法优化雾气图像和夜间图像
可以查看这篇文章:论文记录 - Single Image Haze Removal Using Dark Channel Prior
caoqi95
2019/06/03
1.1K1
opencv操作图像像素和通道
老师让我评价一下别人的一个跟踪效果,只有带跟踪框的视频,所以需要检测这个框,用了下投影,最早用matlab写的一个脚本,很简单,转到opencv里反而有些麻烦,老不用忘得很厉害,昨天搞了2个小时可以运行了,中间用到图像像素和通道的操作,顺便做个总结: 灰度图像,加的红色框,我想做的是检测到这个红色框的四个顶点的位置,比如下面这个图:
和蔼的zhxing
2018/09/04
1.7K0
opencv操作图像像素和通道
图像阿尔法通道
算法:图像阿尔法通道是RGB色彩空间三个通道的基础上,还可以加上一个A通道,也称alpha通道,表示透明度和半透明度。虽然图像阿尔法通道值不同,但是在图像显示时没有差别。这种四个通道的色彩空间被称为RGBA色彩空间,PNG格式的图像是一种典型的四通道图像。alpha通道的赋值范围是[0, 1],或[0, 255],表示从透明到不透明。
裴来凡
2022/05/28
9910
图像阿尔法通道
【图像篇】OpenCV图像处理(三)---图像数据&通道分离
粉丝朋友们,我们又见面了,上周我们一同学习了opencv图像处理的基本显示和保存等操作(【图像篇】OpenCV图像处理(二)---图像读取与显示),既然显示了图像,那么我们就要对其进行一系列的操作了,现在,让我们一同走进今天的学习内容-----【图像数据】&【通道分离】
用户5410712
2022/06/01
7680
【图像篇】OpenCV图像处理(三)---图像数据&通道分离
Opencv 图像处理:图像通道、直方图与色彩空间
将彩色图像,分成b 、g 、r 3个单通道图像。方便我们对 BGR 三个通道分别进行操作。
timerring
2022/11/02
2.1K0
Opencv 图像处理:图像通道、直方图与色彩空间
python输出图像通道数_python查看图片通道数
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/01
1.1K0
GPUImage详细解析(九)图像的输入输出和滤镜通道
前言 GPUImage系列解析已经接近尾声,这次介绍的是: 纹理输入输出GPUImageTextureOutput 和 GPUImageTextureOutput 二进制数据输入输出GPUImageRawDataInput 和 GPUImageRawDataOutput 滤镜通道GPUImageFilterPipeline demo用来展示如何使用GPUImageRawDataOutput。 概念介绍 1、GPUImageTextureOutput GPUImageTextureOutput类实现GP
落影
2018/04/27
2.2K0
GPUImage详细解析(九)图像的输入输出和滤镜通道
OpenCV之图像通道分离合并
python代码: import cv2 as cv src = cv.imread("./test.png") cv.namedWindow("input", cv.WINDOW_AUTOSIZE) cv.imshow("input", src) # 蓝色通道为零 mv = cv.split(src) mv[0][:, :] = 0 dst1 = cv.merge(mv) cv.imshow("output1", dst1) # 绿色通道为零 mv = cv.split(src) mv[1][:,
MachineLP
2021/07/19
3170
OpenCV之图像通道分离合并
java:BufferedImage判断图像通道顺序并转RGB/BGR
10km
2018/01/03
1.8K0
【Alpha系列】之alpha#1
Alpha是投资者获得与市场波动无关的回报,一般用来度量投资者的投资技艺。比如投资者获得了12%的回报,其基准获得了10%的回报,那么Alpha或者价值增值的部分就是2%. 小编将推出一系列Alpha策略,希望能起到抛砖引玉的作用。如有不足之处,欢迎批评指正~~ 策略设计 在这里就不对alpha作介绍了,想了解alpha的读者可以去看看前两天Thomas大大推的《多因子系列之二》~ 那我们就直接从策略开始吧。作为alpha系列的第一篇,我们先来实现一个简单的Alpha策略。 首
量化投资与机器学习微信公众号
2018/01/29
8850
【Alpha系列】之alpha#1
IOS – OpenGL ES 调节图像RGB通道 GPUImageRGBFilter
GPUImageRGBFilter 属于 GPUImage 颜色处理相关,用来处理图片 RGB 通道,shader 源码如下:
猿说编程[Python和C]
2023/03/19
4230
Pandas读取在线文件和剪贴板
该函数表示的是直接读取在线的html文件,一般是表格的形式;将HTML的表格转换为DataFrame的一种快速方便的方法,这个函数对于快速合并来自不同网页上的表格非常有用。
皮大大
2023/08/25
2090
NIO系列(四)——socket通道和serversocket通道
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
逝兮诚
2019/10/30
9070
【Win32】初识Win32编程
编译链接过程:将代码转换为机器语言,将生成的res文件和obj文件加上使用的库链接到一起,整合出一个exe文件,这是用编译器所感受不到的。
半生瓜的blog
2023/05/13
2.1K0
【Win32】初识Win32编程
点击加载更多

相似问题

使用透明通道和alpha通道创建.tiff图像

116

win32上的wxImage没有alpha通道

20

alpha通道的图像贴图

30

glBlendFunc和alpha通道

20

在Win32中用alpha通道显示32位图像

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文