我想把gif图片的透明背景填上自己的颜色,怎么弄啊? 如题。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果GIF图片中使用了透明色,那么你就需要自己写解码程序了如果GIF图片中没有使用透明色,那么讲透明色替换为你自己想要的颜色就可以了 我如何知道是否使用了透明色?如何替换?能给出一些codes吗? 最笨的办法bkColor 背景色myColor 你要使用的颜色HBITMAP hBmp 是你的位图可以这样啊for(int i=0;i<位图的宽度;i++) for(int j=0;j<位图的高度;j++) if(GetPixel()==bkColor) SetPixel(...,myColor);不过这样效率很低的,最好是得到位图的内存数据,然后对内存数据修改,修改完后在复制回去用眼来判断是否使用了背景色啊,哈哈 开玩笑了,在GIF文件中有一个标记表明是否使用透明色,也可以得到透明色的RGB值不过在图像中是否使用了透明色就只有靠眼来判断了,或着在网上找一个GIF的解码源代码自己解码时处理一下我的意思是,比如你背景色是黑色,但是图像上人物的眼睛也是黑色的,就有可能造成眼睛也被你自己的透明色替换掉了,这种情况可能就需要自己解码了 我有一个格式:如下,大侠分析分析以一下。typedef struct tagGIFHEAD{ BYTE bySignature[3] ; // 固定为 "GIF" BYTE byVersion[3] ; // "89a" 或 "87a" WORD wWidth ; // 屏幕宽度 WORD wHeight ; // 屏幕高度 struct { BYTE PalBits : 3 ; // 确定调色板大小 : 3 * (1 << (PalBits + 1)) BYTE SortFlag : 1 ; // 调色板中的颜色是否按使用率排序 BYTE ColorRes : 3 ; // 可计算分辨率 : 3 * (1 << (ColorRes + 1)) BYTE GlobalPal : 1 ; // 全局调色板, 为 1 时PalBits才有意义 } GlobalFlag ; BYTE byBackground ; // 图像小于逻辑屏幕时, 用此颜色填充未被覆盖的区域 BYTE byAspect ; // 逻辑屏幕宽高比} GIFHEAD, * PGIFHEAD ; // 13 - Bytes/************************************************************//* 全局调色板在文件中的偏移量总是13 *//************************************************************/typedef struct tagGIFINFO{ BYTE byVersion[4] ; // "89a" 或 "87a" WORD wTotalFrame ; // 总帧数 WORD wCurrentFrame ; // 当前帧号 [0..wTotalFrame] WORD wGolPalNum ; // 全局调色板颜色个数, 为0则无 WORD wDelayTime ; // 两帧间延时毫秒数 BYTE byInterlace ; // 是否以交错方式存储 BYTE byTransFlag ; // 是否有透明色 BYTE byTransparencyIndex ;// 透明色索引值, 此颜色不显示在屏幕上 BYTE byBitCount ; // 为真实ColorBit数 DWORD * pFrameIndexArray ;// 帧指针, 在文件中的偏移量, 定位在0x2C后的第一个字节 BYTE * pStart ; // 数据流的起始指针} GIFINFO, * PGIFINFO ;其中byTransFlag 是否就是你说的标记?而byTransparencyIndex是否就是你说的透明色的RGB值?可是为什么是BYTE型的??至于解码,555... 我给你一个GIF的解码文件吧,我从网上下的,我在里面加了点些注释(不多),你可以看看,你问的问题应该都可以解决的,给我你的邮箱吧 直接读取文本某一行出错 请教kamel-zhao算法原理。 vc++ 2008 sp1 中的多文档问题 vc 里的HANDLE类型在activeX控件里对应什么类型? 关于dshow的问题 如何断开网络和恢复网络? 急救,界面不显示?,小弟没分了大侠不要嫌分少哦. 哪位高人自己写过安装程式?100分! 如果在Navigate后面还想添加其他语句,如何处理。 C++ 多语言 请问DYNAMCI_DOWNCAST,STATIC_DOWNCAST有什么作用?有什么不同 卫星轨道的二维和三维显示问题(使用opengl)
如果GIF图片中没有使用透明色,那么讲透明色替换为你自己想要的颜色就可以了
bkColor 背景色
myColor 你要使用的颜色HBITMAP hBmp 是你的位图可以这样啊
for(int i=0;i<位图的宽度;i++)
for(int j=0;j<位图的高度;j++)
if(GetPixel()==bkColor)
SetPixel(...,myColor);不过这样效率很低的,最好是得到位图的内存数据,然后对内存数据修改,修改完后在复制回去用眼来判断是否使用了背景色啊,哈哈
不过在图像中是否使用了透明色就只有靠眼来判断了,或着在网上找一个GIF的解码源代码自己解码时处理一下
我的意思是,比如你背景色是黑色,但是图像上人物的眼睛也是黑色的,就有可能造成眼睛也被你自己的透明色替换掉了,这种情况可能就需要自己解码了
{
BYTE bySignature[3] ; // 固定为 "GIF"
BYTE byVersion[3] ; // "89a" 或 "87a"
WORD wWidth ; // 屏幕宽度
WORD wHeight ; // 屏幕高度
struct
{
BYTE PalBits : 3 ; // 确定调色板大小 : 3 * (1 << (PalBits + 1))
BYTE SortFlag : 1 ; // 调色板中的颜色是否按使用率排序
BYTE ColorRes : 3 ; // 可计算分辨率 : 3 * (1 << (ColorRes + 1))
BYTE GlobalPal : 1 ; // 全局调色板, 为 1 时PalBits才有意义
} GlobalFlag ;
BYTE byBackground ; // 图像小于逻辑屏幕时, 用此颜色填充未被覆盖的区域
BYTE byAspect ; // 逻辑屏幕宽高比
} GIFHEAD, * PGIFHEAD ; // 13 - Bytes
/************************************************************/
/* 全局调色板在文件中的偏移量总是13 */
/************************************************************/
typedef struct tagGIFINFO
{
BYTE byVersion[4] ; // "89a" 或 "87a"
WORD wTotalFrame ; // 总帧数
WORD wCurrentFrame ; // 当前帧号 [0..wTotalFrame]
WORD wGolPalNum ; // 全局调色板颜色个数, 为0则无
WORD wDelayTime ; // 两帧间延时毫秒数
BYTE byInterlace ; // 是否以交错方式存储
BYTE byTransFlag ; // 是否有透明色
BYTE byTransparencyIndex ;// 透明色索引值, 此颜色不显示在屏幕上
BYTE byBitCount ; // 为真实ColorBit数
DWORD * pFrameIndexArray ;// 帧指针, 在文件中的偏移量, 定位在0x2C后的第一个字节
BYTE * pStart ; // 数据流的起始指针
} GIFINFO, * PGIFINFO ;
其中byTransFlag 是否就是你说的标记?
而byTransparencyIndex是否就是你说的透明色的RGB值?可是为什么是BYTE型的??至于解码,555...