由于项目需要,做了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个积分,没办法,抱歉了诸位