如何提取Bitmap中特定颜色图形到新位图中??刚接触的新手,谢谢!!

gzl 2005-02-18 07:22:08
请教各位前辈,我需要完成如下的任务,实在是没入门,如何入手,需要什么步骤,详细些谢谢!!
有一个源位图,是24位,windows格式,其中有图形,各位颜色都有,现在需要将一种颜色的图形提取出来
比如红色图形:RGB(255,0,0),将这个图像放到新文件中。就这么简单。

说说我是怎么做的吧:我用CFile类(m_BaseBitmapFile对象)将文件打开,跳过文件头,跳过图像信息头:
this->m_BaseBitmapFile.Seek(this->m_BMFH.bfOffBits, CFile::begin);
m_BMFH是BITMAPFILEHEADER。然后我遍历了每个像素:

for(LONG lHighIdx = NULL; lHighIdx < BMIH.biHeight; lHighIdx ++)
{
for(LONG lWidthIdx = NULL; lWidthIdx < (((BMIH.biWidth * BMIH.biBitCount + 31) / 32) * 4); lWidthIdx += sizeof(RGBTRIPLE))
{
// 源图像当前像素 RGB 值
RGBTRIPLE CurrentRT;

// 读出源图像当前像素 RGB 值
PasteBitmapFile.Read(¤tRT, sizeof(RGBTRIPLE));

// 判断该像素是否在要求提取范围内
if(((UINT)::abs(CurrentRT.rgbtRed - GetRValue(this->m_DistillColor)) <= this->m_uiColorMissRange))
&& ((UINT)::abs(GetGValue(this->m_DistillColor) - CurrentRT.rgbtGreen) <= this->m_uiColorMissRange)
&& ((UINT)::abs(GetBValue(this->m_DistillColor) - CurrentRT.rgbtBlue) <= this->m_uiColorMissRange))
// 写入基片图像文件象素值
this->m_BaseBitmapFile.Write(¤tRT, sizeof(RGBTRIPLE));
else
// 在基片文件中跳过该象素
this->m_BaseBitmapFile.Seek(sizeof(RGBTRIPLE), CFile::current);
}
}

循环控制应该没有问题,不会错位吧,我在循环里什么都不做(也就是把if给删除了),直接输出到目标文件是没问题的。
但是,如果我一加上if后,也就是跳过了一些像素后,输出位图文件中的图像就不正确了,不连续了。

各位前辈,我这种思路对吗???可行否???哪为什么输出的图像就不是那么连续,我看了,少的部分也是红色的啊??!!
谢谢了,头有点大。
...全文
171 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
super852 2005-02-24
  • 打赏
  • 举报
回复
建义用GDI+的类Image或Bitmap
hushuangyan74 2005-02-24
  • 打赏
  • 举报
回复
asett1(asett1),这种方法很好,值得学习。
不过应该是相应位用&操作吧
条件的判断为:
if(CurrentRT & RGB(255,0,0)==RGB(255,0,0))
就显示,其它只显示背景色。
可能要把RGB(255,0,0)转换为一个DWORD的格式才能这样做,我没有再电脑上面试。
还有一个问题:
就是windows下面的BMP的图像数据试RGBQUAD ,
OS/2下面的BMP图像数据才是RGBTRIPLE,
具体我也不记得了,如果有误,请海涵!
asett1 2005-02-23
  • 打赏
  • 举报
回复
你可以对某种像素做ROP运算,就直接得到了新图像。哪里这么麻烦啊,这么像素循环很慢的

lanstar200 2005-02-22
  • 打赏
  • 举报
回复
else
完了新图就不写数据了吗?要写底色进去阿,不然当然混乱了
alaixpz 2005-02-19
  • 打赏
  • 举报
回复
关注中。。。
gzl 2005-02-19
  • 打赏
  • 举报
回复
真的很需要帮助,支支招也行啊。
自己顶。
kingofvc 2005-02-19
  • 打赏
  • 举报
回复
不知道你有没有考虑位图数据中每行数据未满4字节 使用冗余数据补齐的问题?
比如24位位图每行只有一个象素那么0,1,2 这三个字节代表第一行的内容 第二行应该从第4个直接开始也就是4,5,6代表第二个象素
gzl 2005-02-19
  • 打赏
  • 举报
回复
自己顶。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧