图像处理2——求负片

什么是负片?负片就是旧式傻瓜相机拍下来的底片那种图片,一般可以用过用maxColor减去每个像素的值得到的就是负片,计算公式如下:

image[i] = maxColor - image[i];

这里我只处理了px值为5和6的图片,代码如下:

#include <cstdio>
#include <cstdlib>

class _ppm
{
private :
	int pX;								//类型
	int sizeX,sizeY;					//大小
	unsigned char maxColor;				//颜色范围
	unsigned char *image;				//保存像素

public :
	~_ppm ()
	{
		if (image != NULL)
			free (image);
		image = NULL;
	}
	bool read_image (char *ch);
	void _ppm::write_image (char *ch);
	void reversal ();
};


bool _ppm::read_image (char *ch)
{//图片路径,返回是否读取成功
	FILE *fp = fopen (ch, "rb");
	if (fp == NULL)
	{
		printf ("读取文件失败\n");
		return false;
	}
	char str[5];
	fscanf (fp, "%s", str);
	if (str[0] != 'P')
	{
		printf ("不是PPM图片\n");
		fclose (fp);
		fp = NULL;
		return false;
	}
	pX = str[1] - '0';
	if (pX == 5)
	{
		fscanf (fp, "%d%d%d%c", &sizeX, &sizeY, &maxColor);
		image = (unsigned char *) calloc (sizeX * sizeY, sizeof (unsigned char));
		fread (image, sizeof (unsigned char), sizeX * sizeY, fp);
	}
	else if (pX == 6)
	{
		fscanf (fp, "%d%d%d%c", &sizeX, &sizeY, &maxColor);
		image = (unsigned char *) calloc (sizeX * sizeY * 3, sizeof (unsigned char));
		fread (image, sizeof (unsigned char), sizeX * sizeY * 3, fp);
	}

	fclose (fp);
	fp = NULL;
	return true;
}

void _ppm::write_image (char *ch)
{//图片输出路径
	FILE *fp = fopen (ch, "wb");
	fprintf (fp, "P%d\n%d\n%d\n%d\n", pX, sizeX, sizeY, maxColor);
	if (pX == 5)
	{
		fwrite (image, sizeof (unsigned char), sizeX * sizeY, fp);
	}
	else if (pX == 6)
	{
		fwrite (image, sizeof (unsigned char), sizeX * sizeY * 3, fp);
	}
	fclose (fp);
	fp = NULL;
}

void _ppm::reversal ()
{//求负片
	if (pX == 5)
	{
		for (int i = 0; i < sizeX * sizeY; i++)
		{
			image[i] = maxColor - image[i];
		}
	}
	else if (pX == 6)
	{
		for (int i = 0; i < sizeX * sizeY * 3; i++)
		{
			image[i] = maxColor - image[i];
		}
	}
}

int main ()
{
	_ppm img;
	if (img.read_image("D:\\lena.ppm"))
	{
		img.reversal ();
		img.write_image ("D:\\lena1.ppm");
	}
	_ppm img2;
	if (img2.read_image("D:\\bird.ppm"))
	{
		img2.reversal ();
		img2.write_image ("D:\\bird1.ppm");
	}
//	system ("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值