热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

16位色深屏幕下,可以绘出32位色深的图形吗?

今晚搞了一晚上,没有什么进展,特来向大家求教:ShockWaveFlash控件的IViewObject->Draw()函数在HDC上绘图,屏幕色深为32位时,可以正确绘制带有Alph
今晚搞了一晚上,没有什么进展,特来向大家求教:
    ShockWaveFlash控件的IViewObject->Draw()函数在HDC上绘图,屏幕色深为32位时,可以正确绘制带有Alpha通道的图形,当屏幕色深调整为16位的时候,同样代码,Draw()函数得到的图形的Alpha通道内容不正确。

问有没有办法设置DC信息,让依赖于DC信息的函数在16位色深模式下,认为hdc是在32位颜色深度模式,从而得到正确的结果?

(现在是使用vs2008在一个对话框中插入flash控件,并设置WMode为Transparent,
重写对话框的OnPaint函数:
void Ctemp03Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
// CDialog::OnPaint();
CPaintDC dc(this);
RECT rcTotal;
::GetClientRect(m_hWnd, &rcTotal);
BITMAPINFOHEADER bih = { 0 };
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = rcTotal.right - rcTotal.left;
bih.biHeight = (rcTotal.bottom - rcTotal.top);  // use screen axis
bih.biPlanes = 1;
bih.biBitCount = 32;
bih.biCompression = BI_RGB;
HDC hdcBack = CreateCompatibleDC ( 0 );
char *m_lpBitsOnly = 0;
HBITMAP bmpBack = CreateDIBSection( 0, (PBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&m_lpBitsOnly, NULL, 0x0);
HGDIOBJ hOldObj = ::SelectObject(hdcBack, bmpBack);
CDC hello;
hello.Attach(hdcBack);
PaintWindowlessControls(&hello);
BLENDFUNCTION blendFunc = {AC_SRC_OVER, 0, 0xFF, AC_SRC_ALPHA };
::AlphaBlend(dc.GetSafeHdc(), 0, 0, bih.biWidth, bih.biHeight, hdcBack, 0, 0, bih.biWidth, bih.biHeight, blendFunc );
::SelectObject(hdcBack, hOldObj);
::DeleteObject(bmpBack);
//FILE *f = fopen("d:\\b.bin", "wb");
//fwrite(m_lpBitsOnly, 1, bih.biWidth*bih.biHeight*4, f);
//fclose(f);
//}
}
}

这样在16位色深屏幕下面,得到的结果不正确。

使用gimp以Raw Image模式打开注释掉的写文件代码产生d:\b.bin文件,可以明确看到,16bit color模式下,alpha通道全部为零,显然不是需要的结果,而在32bit color模式下面,alpha通道没有问题。)

22 个解决方案

#1


看来得自己使用AlphaBlend的公式来循环遍历图素位数据自己计算了~~

#2


屏幕的模式决定了,应该是不可以吧,等待高手...

#3


引用 1 楼 hastings 的回复:
看来得自己使用AlphaBlend的公式来循环遍历图素位数据自己计算了~~

看来只能逐点自己计算了,不能用api了

#4


#5


问你一个问题:256色的屏幕可以正确显示32位色的图象吗?

16位色不包含ALPHA通道,只能近似模拟。

#6


该回复于2010-12-02 16:07:20被版主删除

#7


16位的格式是什么?565?1555?失真是必然的,有的格式没有A通道,有的格式只能指示是否透明。

#8


是我没有说清楚,代码中使用CreateDIBSection创建32bit的DIB,并SelectObject到CompatibleDC 上面。现在因为屏幕色深是16位的,所以CompatibleDC有调色板,并且是与屏幕匹配的(当然可以使用调色板管理函数进行管理,但仍然无法适应32bit的真彩色情况)。
    我目前是使用DDraw的surface强制锁定表面为32位的,勉强解决了问题,但总觉得可能有更好的办法来做这个。

#9


如果你只是想通过一种方式在16位的屏幕上输出32的资源图片
我觉得最合理的就是进行内存转换
也就是通过一种方式将图片转成16的

#10


这个类似有点像素差值的味道
看来只能通过自己计算来实现了。

#11


上面列出代码的尾部有将图像存储到d:\b.bin的操作,使用gimp打开,可以看到flash绘制出的图形。

图形不仅仅是要显示出来,一方面需要使用flash绘出图形所带的alphpa值融合到另一幅图像上,另一方面也要能保存到本地,供其它程序使用(仍然要求带有正确的alpha通道)。

可见对alpha通道的要求非常的强硬,必须得到32bit的、带有正确alpha通道的图像, 没有其它的办法可以绕行。

在32位屏幕色深时上面代码没有问题。

在16位屏幕色深的情况下,以上代码得到的flash控件绘出的图形r,g,b没有问题,但alpha通道为0.

现使用ddraw的surface锁定表面为32位,可以勉强解决问题。

问:有无其它更简单的办法(比如设置CompatibleDC的某种属性)使得代码得到带有正确alpha通道信息的图形。

#12


本帖最后由 xianglitian 于 2010-12-03 08:53:06 编辑
16位色深是应用在什么场合?

#13


恐怕没有什么简便的方法
至少我不知道
以前用Ddraw做游戏的时候都是自己计算alpha通道的

#14


个人认为(仅仅是猜测)
因为楼主用的是CreateCompatibleDC因此,DC的设置肯定是当前的屏幕显卡显示的模式.
是否可以用CreateDC来创建呢?
刚刚查了下DEVMODE里面确实是可以选择的 dmBitsPerPel参数

#15


CreateDC应该是一个可行的办法。
我前面用CreateDC("DISPLAY",...)这样简单的试过,没有成功(是在没有装显卡驱动的机器上),可能是我的参数没有填写正解,也可能是创建后还需要进行相关的设置。

#16


lisunlin0 你的头像 好像和csdn谁的一样!!!!!!!!!!!!!!!!!!!!!!!!!!

#17


真的是无语了,只要屏幕的色深没有改变,你Create什么DC都没有用。

#18


默默学习...

#19


直接CreateDC那样会导致一些颜色褪色错误,16位色深下貌似用DrawDib函数组绘制可以自动褪色的样子。

#20


有点难度,现在的技术设备好象没必要费这个精力啊

#21


当屏幕色深改为16位时,GDI的绘图函数都会受到影响,比如下图:



但是似乎GDI+的DrawImage函数不受影响,比如这个蜘蛛:


#22


怎么那么小的图啊






推荐阅读
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 详解 Qt 串口通信程序全程图文 (4)
    Qt串口通信程序全程图文是本文介绍的内容,本文一开始先讲解对程序的改进,在文章最后将要讲解一些重要问题。1、在窗口中加入一些组合框ComboBox&# ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
author-avatar
dsvsV
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有