优雅简洁的黑白图片缩放C++源代码

本文分享了一段使用C++编写的高效图片缩放代码,利用位操作实现,适用于Windows MFC环境。代码巧妙地运用了set_bit()和get_bit()函数,实现了无需for循环直接访问和存储像素位,提高了缩放效率,展现了编程的简洁与优雅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         某天,观赏美丽的夕阳,看着满天的红霞铺满海面,偶得灵感,写下了优雅简洁的黑白图片缩放代码,贴出来与诸君共赏。

BOOL hbmp_stretch_bbp1(HBITMAP hbmp_dst, HBITMAP hbmp_src)
{
	BOOL ret = FALSE;

	BITMAP info_src, info_dst;

	GetObject(hbmp_src, sizeof(BITMAP), &info_src);
	GetObject(hbmp_dst, sizeof(BITMAP), &info_dst);

	if (info_dst.bmBits && info_src.bmBits) {
		uint8_t* src = (uint8_t*)info_src.bmBits;
		uint8_t* dst = (uint8_t*)info_dst.bmBits;
		int pix_src, line_src, line_dst;
		uint8_t val;
		for (int y = 0; y < info_dst.bmHeight; y++) {
			line_src = (y * info_src.bmHeight / info_dst.bmHeight) * 
                info_src.bmWidthBytes;
			line_dst = y * info_dst.bmWidthBytes;
			for (int x = 0; x < info_dst.bmWidth; x++) {
				pix_src = x * info_src.bmWidth / info_dst.bmWidth;
				val = get_bit(&src[line_src], pix_src);
				set_bit(&dst[line_dst], x, val);
			}
		}
		ret = TRUE;
	}

	return ret;
}

set_bit()与get_bit()函数是神来之笔,无需for循环可以直接访问、存贮一行像素的任意位,尽显优雅。

void set_bit(uint8_t *data, int bits, uint32_t val)
{
	int bytes = bits / 8;
	int offset = bits % 8;

	uint32_t op = 0x80 >> offset;
	if (val) {
		data[bytes] |= op;
	}else {
		data[bytes] &= (~op);
	}
}

uint8_t get_bit(uint8_t* data, int bits)
{
	int bytes = bits / 8;
	int offset = bits % 8;
	uint32_t op = 0x80 >> offset;
	return (data[bytes] & op);
}

注:代码在windows MFC环境测试通过,稍作修改,可以移植到其它平台。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值