| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2038 人关注过本帖
标题:位图颜色失真
只看楼主 加入收藏
SeaWater
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-9-30
结帖率:66.67%
收藏
已结贴  问题点数:10 回复次数:4 
位图颜色失真
用StretchDIBits函数显示位图,位图的原始大小是(600,800),按正常大小显示时颜色没有问题,当我把位图缩小后,比如50%,这时位图显示的颜色会失真,某些地方好像因为重叠颜色加深。请问各位高手,这个问题如何解决啊,谢谢了!!
搜索更多相关主题的帖子: 位图 颜色 失真 
2010-10-21 21:54
shafeilong
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:236
专家分:1434
注 册:2009-3-21
收藏
得分:10 
在 VC 中使用 StretchBlt 会碰到一些与点阵图大小缩放相关的一些问题。在扩展一个点阵图时,StretchBlt必须复制图素行或列。如果放大倍数不是原图的整数倍,那么此操作会造成产生的图像有些失真。

  如果目的矩形比来源矩形小,那么StretchBlt在缩小图像时就必须把两行(或列)或者多 行(或列)的图素合并到一行(或列)。完成此操作有四种方法,它根据装置内容伸展模式属性来选择其中一种方法。您可使用 SetStretchBltMode 函数来修改这个属性。

       SetStretchBltMode (hdc, iMode) ;

       iMode 可取下列值:

       BLACKONWHITE 或者 STRETCH_ANDSCANS(内定):如果两个或多个图素得合并成一个图素,那么StretchBlt会对图素执行一个逻辑AND运算。这样的结果是只有全部的原始图素是白色时该图素才为白 色,其实际意义是黑色图素控制了白色图素。这适用于白背景中主要是黑色的单色点阵图。

       WHITEONBLACK 或 STRETCH_ORSCANS:如果两个或多个图素得合并成一个图素,那么StretchBlt 执行逻辑OR运算。这样的结果是只有全部的原始图素都是黑色时才是黑色,也就是说由白色图 素决定颜色。这适用於黑色背景中主要是白色的单色点阵图。

       COLORONCOLOR 或 STRETCH_DELETESCANS:StretchBlt 简单地消除图素行或列,而没有任何逻辑组合。这是通常是处理彩色点阵图的最佳方法。

       HALFTONE 或 STRETCH_HALFTONE:Windows根据组合起来的来源颜色来计算目的的平均颜色。这将与半调调色盘联合使用,第十六章将展示这一程序。

       利用StretchBlt缩小图片时有时会出现颜色失真。解决步骤如下:

       1、先把目标DC (也就是 HDC hDestDC) ::SetStretchBltMode (hDestDC, HALFTONE);
       2、调用一下 ::SetBrushOrgEx(hDestDC, 0, 0, NULL);
       3、最后调用 CImage 的 StretchBlt

    或者这样解决:

     1。hbit = (HBITMAP)LoadImage( NULL,cBmpPath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    if(hbit != NULL) {
     Bitmap.Attach(hbit);
     DCCompatible.CreateCompatibleDC(GetDC());
     DCCompatible.SelectObject(&Bitmap);
     Bitmap.GetObject(sizeof(bm),&bm);}

    2。OnPaint():

    pDC->SetStretchBltMode(HALFTONE);
    pDC->StretchBlt(MAP_LEFT,MAP_TOP,MAP_WIDTH,MAP_HEIGHT,

&DCCompatible,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
转自http://hi.baidu.com/pslsky/blog/item/046199fc609fe0f0fc037fb6.html
2010-10-22 12:48
SeaWater
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-9-30
收藏
得分:0 
非常感谢!!
2010-10-24 22:33
hlkj
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-10-22
收藏
得分:0 
我是刚开始学这个,我不会C语言,但是我想直接学习C++是否可行?
2010-10-25 21:31
SeaWater
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-9-30
收藏
得分:0 
C++就是对c的扩充,它在c的设计基础上加了一些新思想,所以我觉得可以的,呵呵。
2010-10-28 21:08
快速回复:位图颜色失真
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011827 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved