21xrx.com
2025-06-11 21:45:39 Wednesday
文章检索 我的文章 写文章
C++ 图片读取格式
2023-07-05 13:00:51 深夜i     26     0
C++ 图片读取 格式 编程语言 图像处理

在C++开发中,图片读取是一个常见的需求。然而,不同的图片格式有着不同的读取方式。在这篇文章中,我们将介绍几种常用的图片格式以及它们的读取方式。

1. BMP

BMP是一种非常基本的图片格式,它的读取方式也非常简单。我们可以使用C++的fstream库来读取BMP文件。例如,下面的代码可以打开一个BMP文件并读取其中的数据:

#include <fstream>
using namespace std;
int main() {
 ifstream file("example.bmp", ios::binary | ios::ate);
 if (!file.is_open())
  cout << "fail to open file" << endl;
  return 1;
 
 int size = file.tellg();
 char* data = new char[size];
 file.seekg(0, ios::beg);
 file.read(data, size);
 file.close();
 delete[] data;
 return 0;
}

2. PNG

PNG是一种压缩图片格式,它的读取方式比BMP要复杂。我们可以使用第三方库libpng来读取PNG文件。例如,下面的代码可以打开一个PNG文件并读取其中的数据:

#include <png.h>
int main() {
 png_byte header[8];
 FILE* fp = fopen("example.png", "rb");
 fread(header, 1, 8, fp);
 png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
 png_infop info_ptr = png_create_info_struct(png_ptr);
 setjmp(png_jmpbuf(png_ptr));
 png_init_io(png_ptr, fp);
 png_set_sig_bytes(png_ptr, 8);
 png_read_info(png_ptr, info_ptr);
 png_uint_32 width = png_get_image_width(png_ptr, info_ptr);
 png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
 png_byte color_type = png_get_color_type(png_ptr, info_ptr);
 png_byte bit_depth = png_get_bit_depth(png_ptr, info_ptr);
 png_read_update_info(png_ptr, info_ptr);
 png_bytep* row_pointers = new png_bytep[height];
 for (int y = 0; y < height; y++) {
  row_pointers[y] = new png_byte[png_get_rowbytes(png_ptr, info_ptr)];
 }
 png_read_image(png_ptr, row_pointers);
 fclose(fp);
 for (int y = 0; y < height; y++) {
  delete[] row_pointers[y];
 }
 delete[] row_pointers;
 return 0;
}

3. JPEG

JPEG是一种流行的压缩图片格式,它的读取方式也比BMP要复杂。我们可以使用第三方库libjpeg来读取JPEG文件。例如,下面的代码可以打开一个JPEG文件并读取其中的数据:

#include <jpeglib.h>
int main() {
 struct jpeg_decompress_struct cinfo;
 struct jpeg_error_mgr jerr;
 FILE* fp = fopen("example.jpg", "rb");
 cinfo.err = jpeg_std_error(&jerr);
 jpeg_create_decompress(&cinfo);
 jpeg_stdio_src(&cinfo, fp);
 jpeg_read_header(&cinfo, TRUE);
 jpeg_start_decompress(&cinfo);
 int width = cinfo.output_width;
 int height = cinfo.output_height;
 int channels = cinfo.output_components;
 int row_stride = width * channels;
 unsigned char* data = new unsigned char[width * height * channels];
 while (cinfo.output_scanline < height) {
  unsigned char* row_pointer = &data[cinfo.output_scanline * row_stride];
  jpeg_read_scanlines(&cinfo, &row_pointer, 1);
 }
 jpeg_finish_decompress(&cinfo);
 jpeg_destroy_decompress(&cinfo);
 fclose(fp);
 delete[] data;
 return 0;
}

除了上述三种格式,还有许多其他的图片格式,每种格式都有不同的读取方式。掌握各种图片格式的读取方式是C++开发中一个非常重要的技能。

  
  

评论区