21xrx.com
2024-12-22 22:22:21 Sunday
登录
文章检索 我的文章 写文章
C++ 图片读取格式
2023-07-05 13:00:51 深夜i     --     --
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++开发中一个非常重要的技能。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复