常用图像格式(PNG,JPG)到SGI图像格式(RGB,BW)的转换

本文介绍了一种使用OpenCV库将常见的PNG和JPG图像格式转换为SGI图像格式(RGB和BW)的方法。通过详细解释代码实现过程,包括读取、处理和写入图像数据,展示了如何将图像从一种格式转换为另一种格式。
摘要由CSDN通过智能技术生成

常用图像格式(PNG,JPG)到SGI图像格式(RGB,BW)的转换

网站链接

根据该网站的描述和给的相应例子,自己改写了一个把png,jpg等常用格式的图片转化为rgb,bw格式的代码。

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
\\待转换的图像长宽
#define IXSIZE      (512)
#define IYSIZE      (512)
#include<opencv.hpp>
using namespace cv;

void putbyte(FILE *outf, unsigned char val)
{
	unsigned char buf[1];

	buf[0] = val;
	fwrite(buf, 1, 1, outf);
}


void putshort(FILE *outf, unsigned short val)
{
	unsigned char buf[2];

	buf[0] = (val >> 8);
	buf[1] = (val >> 0);
	fwrite(buf, 2, 1, outf);
}

static int putlong(FILE *outf, unsigned long val)
{
	unsigned char buf[4];

	buf[0] = (val >> 24);
	buf[1] = (val >> 16);
	buf[2] = (val >> 8);
	buf[3] = (val >> 0);
	return fwrite(buf, 4, 1, outf);
}

int main()
{
	printf("%d\n", sizeof(unsigned));
	Mat img, img1;
	Mat dst;
	img = imread("./scene_dense_mesh_refine_texture1.jpg");
	img1 = imread("./test.jpg");
	printf("%d\n", img.rows);
	printf("%d\n", img.cols);

	resize(img, dst, Size(256, 256), (0, 0), (0, 0), INTER_LINEAR);
	imwrite("./test2.png", dst);

	//imwrite("./test.jpg", dst);
	printf("%u %u %u\n", img.at<Vec3b>(255, 0)[2], img.at<Vec3b>(255, 0)[1], img.at<Vec3b>(255, 0)[0]);
	printf("%u %u %u\n", img.at<Vec3b>(0, 255)[2], img.at<Vec3b>(0, 255)[1], img.at<Vec3b>(0, 255)[0]);
	imshow("img", img);
	waitKey(0);
	FILE *of;
	char iname[80];
	unsigned char outbuf[IXSIZE];
	int i, x, y;

	of = fopen("example.rgb", "w");
	if (!of) {
		fprintf(stderr, "sgiimage: can't open output file\n");
		return -1;
	}
	putshort(of, 474);       /* MAGIC               */
	putbyte(of, 0);          /* STORAGE is VERBATIM */
	putbyte(of, 1);          /* BPC is 1            */
	putshort(of, 3);         /* DIMENSION is 2      */
	putshort(of, IXSIZE);    /* XSIZE               */
	putshort(of, IYSIZE);    /* YSIZE               */
	putshort(of, 3);         /* ZSIZE               */
	putlong(of, 0);          /* PIXMIN is 0         */
	putlong(of, 255);        /* PIXMAX is 255       */
	for (i = 0; i<4; i++)      /* DUMMY 4 bytes       */
		putbyte(of, 1);
	//strcpy(iname, "11111111111111111111111111111111111111111111111111111111111111111111111111111111");
	fwrite(iname, 80, 1, of);  /* IMAGENAME           */
	putlong(of, 0);          /* COLORMAP is 0       */
	for (i = 0; i<404; i++)    /* DUMMY 404 bytes     */
		putbyte(of, 0);
	for (int z = 0; z<3; z++)
	{
		for (y = 0; y<IYSIZE; y++) {

			for (x = 0; x < IXSIZE; x++)
			{
				
				Vec3b vec3 = img.at<Vec3b>(IXSIZE-1-y, x);
	
				if (z == 0)
				{
					
					if (vec3[2] == 10)
						vec3[2] = vec3[2] - 1;
						outbuf[x] = vec3[2];

						if(sizeof(vec3[2])!=1)
						printf("%d\n", sizeof(vec3[2]));
						if (vec3[2] > 255 || vec3[2] < 0)
							printf("hrer\n");

				}
				if (z == 1)
				{
					//if (x > 128 && y < 128)
					//	outbuf[x] = 255;
					//else
					if (vec3[1] == 10)
						vec3[1] = vec3[1] - 1;
						outbuf[x] = vec3[1];

				}
				if (z == 2)
				{
					//if (x < 128 && y>128)
					//{
					//	outbuf[x] = 255;
				//	}
					//else
					if (vec3[0] == 10)
						vec3[0] = vec3[0] - 1;
						outbuf[x] = vec3[0];
				}
			}
			fwrite(outbuf, IXSIZE, 1, of);
		}
	}
	printf("sunccess\n");
	fclose(of);
	system("pause");
}

写入像素10会有意想不到的错误,所以把像素10都改为了9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值