Load png image file or data, use libpng library function to decode png image, and convert it into jpg and bmp format image data, you can use libjpeg library function encoding jpg image data. Hope to be able to provide the relevant code. Thank you. Visual Studio C ++
What I have tried:
int ReadPNGfile(const char* filename, CImageInfo* img)
{
FILE *fp; fp = fopen(filename, "rb");
if(fp == NULL)
{
perror("fopen");
return -1;
}
char buf[PNG_BYTES_TO_CHECK];
int temp;
png_structp png_ptr;
png_infop info_ptr;
png_ptr= png_create_read_struct(PNG_LIBPNG_VER_STRING, 0,0,0);
if (png_ptr == NULL)
{
fclose(fp);
return -1;
}
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL)
{
fclose(fp);
png_destroy_read_struct(&png_ptr, NULL, NULL);
return -1;
}
if (setjmp(png_jmpbuf(png_ptr)))
{
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(fp);
return -1;
}
temp = fread(buf,1,PNG_BYTES_TO_CHECK,fp);
temp = png_sig_cmp((png_bytep)buf, (png_size_t)0, PNG_BYTES_TO_CHECK);
if (temp!=0)
{
fclose(fp);
return -1;
}
rewind(fp);
png_init_io(png_ptr,fp); png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, NULL); int channels_ = png_get_channels(png_ptr, info_ptr);
int color_type= png_get_color_type(png_ptr, info_ptr);
int bit_depth = png_get_bit_depth(png_ptr, info_ptr);
png_bytep* row_pointers;
row_pointers = png_get_rows(png_ptr, info_ptr);
int width = png_get_image_width(png_ptr, info_ptr);
int height = png_get_image_height(png_ptr, info_ptr);
int size = width * channels_;
size+=size%4; size *= height;
unsigned char* data = new unsigned char[size];
int pos = 0;
int stride=channels_;
for(int i = height-1; i >= 0; i--) {
for(int j = 0; j <stride*width; j += stride)
{
data[pos++] = row_pointers[i][j]; data[pos++] = row_pointers[i][j+1]; data[pos++] = row_pointers[i][j+2]; if(stride==4)
{
data[pos++] = row_pointers[i][j+3]; }
}
pos+=(stride*width)%4;
}
CImageInfo newImg(width,height,channels_,size,data);
*img=newImg;
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
fclose(fp);
return 0;
};