png转txt的关于透明背景变黑色的问题

0

我想把 png 转成 txt 的,然后发现 png 中的透明背景色那些的,被默认转成黑色的了,能不能将 PNG 中但凡是透明色的,可以转成我自己指定的颜色(比如白色)的?谢谢

#include <stdio.h>

int main()
{
	initgraph(500, 500, 1);
	loadimage(NULL, _T("1.png"));
	int a = 0;
	ofstream out("1.txt", ios::out);
	if (!out)
	{
		cout << "未找到1.txt" << endl;
		exit(0);
	}

	for (int i = 0; i < 500; i++)
	{
		for (int j = 0; j < 500; j++)
		{
			a = getpixel(j, i);
			out << hex << a << " ";
		}
	}
	return 0;
}
ava
山泉叮咚

2021-8-29

0

在绘图软件里面将 png 的透明色修改为你需要的颜色,这是最简单的办法。

如果你一定要用带透明色的 png,那么解决方案有两种:

方案 1:使用透明贴图

基本步骤是:先用指定的背景色填充绘图窗口,然后用透明贴图的方式将 png 贴到绘图窗口上,然后再获取每个点的颜色即可。

透明贴图的方法请参考:https://codebus.cn/yangw/transparent-putimage

方案 2:直接读取图像的透明信息

基本步骤是:将 png 文件读取到 IMAGE 对象里,然后通过直接读取显示缓冲区,得到每个点的颜色以及透明度信息。范例如下:

#include <graphics.h> 
#include <stdio.h>

int main()
{ 
	IMAGE img;
	loadimage(&img, _T("D:\\test.png"));	// 图像尺寸为 120 x 140

	DWORD *pbuffer = GetImageBuffer(&img);
	int x = 60, y = 90;						// 准备获取 (60, 90) 位置的颜色
	int c = pbuffer[y * 120 + x];			// 获取颜色值(120 为图片宽度)

	int a, r, g, b;
	a = c >> 24;
	r = (c >> 16) & 0xff;
	g = (c >> 8) & 0xff;
	b = c & 0xff;

	printf("a: %d, r: %d, g: %d, b: %d\n", a, r, g, b);
	// 注意:获取到的 r、g、b 颜色值,为实际颜色值 * a / 255。

	return 0;
}

注:操作显示缓冲区的讲解可以参考:https://codebus.cn/yangw/high-speed-drawing-with-direct-operation-of-display-buffers

ava
慢羊羊

2021-8-29

技术讨论社区