用c语言实现图像的反色,能够实现图像的打开,写入,但是进行图像反色的时候,就会导致输出的图像无法打开,而如果仅仅打开图片,然后将这个图片的二进制数据取出来保存写入另一个图片文件中,是可以打开新生成的这个文件的,相当于复制了一遍,但是一旦进行图像反色处理:r=255-l,进行这个计算之后再把二进制数据写入之后,新生成的图片文件就打不开了
#include
#include
#include
#define height 500
#define width 1500
typedef unsigned char BYTE; // 定义BYTE类型,占1个字节
int main()
{
FILE *fp = NULL;
BYTE B[height][width];
BYTE *ptr;
char path[256];
char outpath[256];
int i,j;
// 输入源路径并打开raw图像文件
printf("Input the raw image path: ");
scanf("%s",path);
if((fp = fopen( path, "rb" )) == NULL)
{
printf("can not open the raw image " );
return;
}
else
{
printf("read OK");
}
// 分配内存并将图像读到二维数组中
ptr = (BYTE*)malloc( width * height * sizeof(BYTE) );
for( i = 0; i < height; i++ )
{
for( j = 0; j < width ; j ++ )
{
fread( ptr, 1, 1, fp );
B[i][j]= *ptr; // 把图像输入到2维数组中,变成矩阵型式
//printf("%d ",B[i][j]);
ptr++;
}
}
fclose(fp);
printf("\n ");
printf("\n ");
printf("\n ");
printf("\n ");
printf("\n ");
// 这里可以对二维数组中的图像数据进行处理
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
B[i][j] = 255- B[i][j] ; // 图像反相
//printf("%d ",B[i][j]);
}
}
// 将处理后的图像数据输出至文件
printf("Input the raw_image path for save: ");
scanf("%s",outpath);
if( ( fp = fopen( outpath, "wb" ) ) == NULL )
{
printf("can not create the raw_image : %s\n", outpath );
return;
}
for( i = 0; i < height; i++ )
{
for( j = 0; j < width ; j ++ )
{
fwrite( &B[i][j], 1 , 1, fp );
}
}
fclose(fp);
}
我认为我从图片中读出数据和写入数据过程没有问题,疑问就是为什么用255减去二进制数据后,得到的所有数据都在0-255以内,为什么用这些数据写入图片中,无法得到反色图片,甚至根本无法打开图片
题主,建议您使用OpenCV来做图片反相处理
关于WIN平台安装配置OpenCV开发环境,可以参考之前写的这篇博客
Win10+OpenCV4.6.0之开发环境(VS2022)配置入门_来灵的博客-CSDN博客
如何使用OpenCV做图片反相处理,刚我做了测试,代码如下:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
Mat src;
int height, width;
int i, j;
src = imread("test.jpg"); //载入图片
height = src.rows; //获取图像信息
width = src.cols * src.channels(); // 列项要乘通道数
namedWindow("src", WINDOW_AUTOSIZE); //创建窗口
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("src", src); //显示原图
//图像反转
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
src.at<uchar>(i, j) = 255 - src.at<uchar>(i, j); // 每一个像素反转
}
}
cv::imwrite("output.jpg", src); //保存反色后的图片
imshow("dst", src); //显示反相图片
waitKey(0);
return 0;
}
运行效果截图
首先回答你问题:你定义的BYTE是unsinged char类型那么他就可以存储0-255的数值,那么255相减就是在0-255之间。如果确定自己读写没有问题,可以尝试用ps将原图片另保存为raw格式,然后生成raw格式图片,再在ps中打开生成的图片查看。如果这样还有问题说明代码中还是存在问题,如果没问题那么就是图片格式影响的读写导致输出图片打开失败。
题主处理的是否是bmp格式的图片呀。该格式图片的读写有其自己的特性,需要考虑它存储方式的。你使用fopen流的形式读写图片,是raw格式图片的读写方式。建议直接使用第三方库读写图片,比如opencv、gdal等
可以看看:https://blog.csdn.net/nanke_yh/article/details/124495265
反色后的文件生成没有?大小是否相同?raw文件内容全是数据吗?
图片数据是有头部信息的,图片播放器正是根据头部信息才能获得图片格式、大小等信息,从而正确显示图片。反色的过程中如果没有对头部信息做单独处理,会将头部信息也进行反色操作,因此你生成的图片严格来说就不是一个图片了,而是一堆二进制数据,图片播放器也就无法正常显示图片了。
raw文件一般是有文件头的,你得按照文件格式来读写,否则文件格式被损坏。你读的是什么raw文件?扩展名是什么?