什么是负片?负片就是旧式傻瓜相机拍下来的底片那种图片,一般可以用过用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;
}