cximage库实现图片重叠效果

最近看电视,当主人公回忆其之前的的美好生活时,之前的美好生活画面会若影若现的显示出来,和当前画面重叠在一起。

本人准备两张照片,首先可以用ffmpeg将两张的尺寸调整成宽高一致。
然后用cximage分别提取相同位置的rgb值,做权重叠加,比如权重为1:1时,则第一张图片的rgb0.5+第二张图片的rgb0.5。
权重为9:1时,则第一张图片的rgb0.9+第二张图片的rgb0.1。

第一张图片如下:
请添加图片描述

第二张图片如下:
请添加图片描述
按照1:1合成,效果如下:
请添加图片描述

代码如下,说明下,本人现在还没真正理解两幅图这样的叠加原理,为何这种权重叠加就能显示出想要的画面;对于单张图片,其各个像素值乘以0.7这样一个小于1的数,生成的图像还能保持原有的轮廓是好理解的,两张图片,感觉难以理解。

// CxImageMerge.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <Windows.h>
#include "cximage/ximage.h"


std::wstring string2wstring(const std::string& str)
{
	std::wstring result;
	//获取缓冲区大小,并申请空间,缓冲区大小按字符计算  
	int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
	TCHAR* buffer = new TCHAR[len + 1];
	//多字节编码转换成宽字节编码  
	MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
	buffer[len] = '\0';             //添加字符串结尾  
	//删除缓冲区并返回值  
	result.append(buffer);
	delete[] buffer;
	return result;
}



int main()
{
	CxImage image(CXIMAGE_FORMAT_JPG);
	image.Load(L"E:\\learn\\c++\\cximage\\CxImageTest\\x64\\Release\\beauty.jpg", CXIMAGE_FORMAT_JPG);

	CxImage imageBack(CXIMAGE_FORMAT_JPG);
	imageBack.Load(L"E:\\learn\\c++\\cximage\\CxImageTest\\x64\\Release\\beauty_back.jpg", CXIMAGE_FORMAT_JPG);

	int iJpgWidth = image.GetWidth();
	int iJpgHeight = image.GetHeight();

	int iJpgWidthBack = imageBack.GetWidth();
	int iJpgHeightBack = imageBack.GetHeight();

	if (iJpgWidth != iJpgWidthBack || iJpgHeight != iJpgHeightBack)
	{
		return -1;
	}

	long x1 = 0;
	long y1 = 0;
	image.GetOffset(&x1, &y1);

	for (int i = 0; i < iJpgWidth; i++)
	{
		for (int j = 0; j < iJpgHeight; j++)
		{
			RGBQUAD rgb = image.GetPixelColor(i, (iJpgHeight - 1) - j, false);
			RGBQUAD rgbBack = imageBack.GetPixelColor(i, (iJpgHeight - 1) - j, false);
			int iRed = rgb.rgbRed * 0.5 + rgbBack.rgbRed * 0.5;
			int iGreen = rgb.rgbGreen * 0.5 + rgbBack.rgbGreen * 0.5;
			int iBlue = rgb.rgbBlue * 0.5 + rgbBack.rgbBlue * 0.5;
			COLORREF color = COLORREF(RGB(iRed, iGreen, iBlue));
			image.SetPixelColor(i, (iJpgHeight - 1) - j, color);
		}
	}
	
	std::string strSavePath = "E:\\learn\\c++\\cximage\\CxImageTest\\x64\\Release\\";
	char szPicName[100] = { 0 };
	sprintf(szPicName, "beauty_0.7.jpg");
	strSavePath = strSavePath + szPicName;

	std::wstring strwSavePath = string2wstring(strSavePath);

	image.Save(strwSavePath.c_str(), CXIMAGE_FORMAT_JPG);

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值