首页 > 编程知识 正文

如何让图片放大不模糊(图像失真怎么解决啊)

时间:2023-05-05 15:30:00 阅读:74668 作者:4432

VC中StretchBlt的模态和失真问题

用相机导入图像,显示在对话框的图像控件中。

现象:原本应该是黑白相机的灰度图像显示为五颜六色的彩色图像。

开始的时候

收集的数据似乎有问题,但从保存的bmp文件来看是正常的。 可以确认正在显示程序

问题。 问题是,基本上是按照sdk的sample一行一行地抄。 唯一的区别是sdk是一个单位

查看项目中可用的所有族。 我的程序显示在对话框的图像控件中。 最有可能出错的是

stretchdibits(PDC-getsafehdc )、

rect.left,

rect.top,

rect.Width ()、//显示窗口宽度

显示rect.Height ()、//窗口的高度

0,

0,

Width,//图像宽度

高,//图像高度

m_pImageBuffer,//图像缓冲器

m_pBmpInfo,//BMP图像描述信息

DIB_RGB_COLORS,

src复制

);

认真检查了所有参数,没有发现异常。

去百度和谷歌疯狂搜索,再重建对话框项目,加载并显示图像。 问题

再现,偶然看到http://hi.Baidu.com/68400165/blog/item/fa 2409 c 66 ab 7e2DBD 000601 a.html中

说到由StretchDIBits引起的失真问题,

添加PDC-setstretchbltmode (硬件);

解决问题!

添加网络文章:

在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根据组合的源颜色计算所需的平均颜色。 它与半色调调色板配合使用,第16章介绍了该过程。

使用StretchBlt缩小图像可能会导致颜色失真。 解决步骤如下。

1、首先把目标直流(即HDC hDestDC ) :3360setstretchbltmode ) HDEstdc,HALFTONE

2、尝试调用:3360setbrushorgex(HDEstdc,0,0,NULL );

3、最后调用CImage的StretchBlt

或者这样解决:

1。 hbit=(hbitmap ) loadimage (空,cBmpPath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE );

if(hbit!=空) {

bitmap.attach(hbit;

DC兼容. createcompatibledc (getdc );

DC兼容. select object (bitmap;

bitmap.getobject(sizeof(bm ),BM ); }

2。 OnPaint () :

PDC-setstretchbltmode(Halftone );

PDC-stretchblt(map_left,MAP_TOP,MAP_WIDTH,MAP_HEIGHT,

DC兼容,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。