如何实现透明图片的镜像翻转

0

此处给出的代码改自"详解透明贴图和三元光栅操作 - CodeBus"(https://codebus.cn/yangw/transparent-putimage)

在坐标轴方向为默认的(1,1)的情况下,透明图片可以正常输出

但我想通过坐标轴取反来输出水平翻转的图片,如代码中所示的那样,运行程序后却没有看到任何图像数据(坐标轴取反后透明图片无法正常输出)

#include <graphics.h>		// EasyX_20190219(beta)
#include <conio.h>
// 引用该库才能使用 AlphaBlend 函数
#pragma comment( lib, "MSIMG32.LIB")


// 半透明贴图函数
// 参数:
//		dstimg: 目标 IMAGE 对象指针。NULL 表示默认窗体
//		x, y:	目标贴图位置
//		srcimg: 源 IMAGE 对象指针。NULL 表示默认窗体
void transparentimage(IMAGE *dstimg, int x, int y, IMAGE *srcimg)
{
	HDC dstDC = GetImageHDC(dstimg);
	HDC srcDC = GetImageHDC(srcimg);
	int w = srcimg->getwidth();
	int h = srcimg->getheight();

	// 结构体的第三个成员表示额外的透明度,0 表示全透明,255 表示不透明。
	BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
	// 使用 Windows GDI 函数实现半透明位图
	AlphaBlend(dstDC, x, y, w, h, srcDC, 0, 0, w, h, bf);
}


// 主函数
int main()
{
	initgraph(600, 400); // 初始化图形窗口

	IMAGE src;
	loadimage(&src, _T("D:\\src4.png"));

	// 透明贴图
	transparentimage(NULL, 120, 0, &src);
	
	//水平翻转透明图片
	setaspectratio(-1, 1);
	transparentimage(NULL, 120, 0, &src);
	setaspectratio(1, 1);

	// 按任意键退出
	_getch();
	closegraph();

	return 0;
}
0

水平翻转图像可以用下面的代码:

// 程序名称:实现图像的水平翻转
// 编译环境:VC6 及以上版本,EasyX_20220901
//
#include <graphics.h> 
#include <conio.h>

// 水平翻转 src,翻转后的图像保存到 dst
void FlipHorizontal(IMAGE* src, IMAGE* dst)
{
	int w = src->getwidth();		// 获取源图像宽度
	int h = src->getheight();		// 获取源图像高度

	// 如果目标图像与源图像尺寸不同,调整目标图像
	if (dst->getwidth() != w || dst->getheight() != h)
		dst->Resize(w, h);

	// 获取源图像与目标图像的显示缓冲区地址
	DWORD* s = GetImageBuffer(src);
	DWORD* d = GetImageBuffer(dst);

	// 左右翻转每一行的像素
	for (int x = 0; x < w; x++)
		for (int y = 0; y < h; y++)
			d[y * w + w - x] = s[y * w + x];
}

int main()
{ 
	initgraph(640, 480);				// 初始化图形窗口
	
	IMAGE img;							// 定义源图像,
	loadimage(&img, "D:\\test.png");	// 加载图片
	putimage(0, 0, &img);				// 显示源图像

	IMAGE img2;							// 定义目标图像
	FlipHorizontal(&img, &img2);		// 将 img 水平翻转后放到 img2 里面
	putimage(200, 0, &img2);			// 显示水平翻转后的图像

	_getch();
	closegraph();

	return 0;
}
ava
BestAns

2023-2-8

感谢大佬♪(・ω・)ノ -  氟拉基米尔  2023-2-8
技术讨论社区