由于项目需要,做了PPM与JPG图像格式相互转换
最简单的转换是python代码,如下:
from PIL import Imageimg = 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