当前位置: 首页 > 工具软件 > PPM Doc > 使用案例 >

PPM图像转JPG

乜业
2023-12-01

由于项目需要,做了PPM与JPG图像格式相互转换

最简单的转换是python代码,如下:

from PIL import Image

img = Image.open("xxx.ppm")
img.save("xxx.jpg")
img.show()

上面是PPM转JPG,JPG转PPM只需将名字相应改一下就可以

 

在网上找不到PPM转JPG的C++代码,自己实现了一下,大家多多提意见 ~ ~

废话少说,直接上代码:

 

typedef struct { uchar r, g, b; } rgb;

#define BUF_SIZE 256

class pnm_error { };

static void pnm_read(std::ifstream &file, char *buf) {
  char doc[BUF_SIZE];
  char c;
  
  file >> c;
  while (c == '#') {
    file.getline(doc, BUF_SIZE);
    file >> c;
  }
  file.putback(c);
  
  file.width(BUF_SIZE);
  file >> buf;
  file.ignore();
}

static image<rgb> *loadPPM(const char *name) {
  char buf[BUF_SIZE], doc[BUF_SIZE];
  
  /* read header */
  std::ifstream file(name, std::ios::in | std::ios::binary);
  pnm_read(file, buf);
  if (strncmp(buf, "P6", 2))
    throw pnm_error();

  pnm_read(file, buf);
  int width = atoi(buf);
  pnm_read(file, buf);
  int height = atoi(buf);

  pnm_read(file, buf);
  if (atoi(buf) > UCHAR_MAX)
    throw pnm_error();

  /* read data */
  image<rgb> *im = new image<rgb>(width, height);
  file.read((char *)imPtr(im, 0, 0), width * height * sizeof(rgb));

  return im;
}

void ppm2jpg(char* input, char* output)
{

	image<rgb> *inputImg = loadPPM(input);

	int input_w = inputImg->width();
	int input_h = inputImg->height();

	cv::Mat outImg = cv::Mat(cv::Size(input_w,input_h),CV_8UC3);
	IplImage* jpg;
	
	
	unsigned char *data = (uchar*)calloc(input_h*input_w*3,sizeof(uchar));

	for (int j = 0; j<input_h; j++)
		for (int i = 0; i<input_w*3;)
		{

			(data + input_w*3*j + i)[0] = (inputImg)->data[input_w*j+int(i/3)].r;
			(data + input_w*3*j + i)[1]= (inputImg)->data[input_w*j + int(i/3)].g;
			(data + input_w*3*j + i)[2]= (inputImg)->data[input_w*j + int(i/3)].b;
			i += 3;
			
		}
	memcpy(outImg.data, data, input_h*input_w*3);
	cv::resize(outImg, outImg, cv::Size(0, 0), 0.5, 0.5, CV_INTER_LINEAR);
	cv::imshow("gg", outImg);
	cv::waitKey();
    cv::imwrite("out.jpg",outImg);
	free(data);
	
	
}

除了上述代码,还少一个.h文件

可以在我的博客下载链接里面下载,表示现在积分最少5个积分,没办法,抱歉了诸位

image.h

 类似资料: