png_read_image上的LibPNG分段错误

时间:2017-03-21 10:16:38

标签: c++ png libpng

我在png_read_image()遇到了分段错误,我无法弄清楚原因。

以下是代码:

  /*
    Initializing pngReadStruct & pngInfoStruct...
  */

  // Getting image's width & height
  png_uint_32 imgWidth = png_get_image_width(pngReadStruct, pngInfoStruct);
  png_uint_32 imgHeight = png_get_image_height(pngReadStruct, pngInfoStruct);

  // Getting bits per channel (not per pixel)
  png_uint_32 bitDepth = png_get_bit_depth(pngReadStruct, pngInfoStruct);
  // Getting number of channels
  png_uint_32 channels = png_get_channels(pngReadStruct, pngInfoStruct);
  // Getting color type (RGB, RGBA, luminance, alpha, palette, etc)
  png_uint_32 colorType = png_get_color_type(pngReadStruct, pngInfoStruct);

  // Refining color type (if colored or grayscale)
  switch (colorType) {
    case PNG_COLOR_TYPE_PALETTE:
      png_set_palette_to_rgb(pngReadStruct);

      // If RBG image, setting channel number to 3
      channels = 3;
      break;

    case PNG_COLOR_TYPE_GRAY:
      if (bitDepth < 8)
        png_set_expand_gray_1_2_4_to_8(pngReadStruct);

      // Updating bitdepth info
      bitDepth = 8;
      break;

    default:
      break;
  }

  // Adding full alpha channel to the image if it possesses transparency
  if (png_get_valid(pngReadStruct, pngInfoStruct, PNG_INFO_tRNS)) {
    png_set_tRNS_to_alpha(pngReadStruct);
    channels += 1;
  }
  // Defining an array to contain image's rows of pixels
  std::vector<png_bytep> rowPtrs(imgHeight);

  // Defining an array to contain image's pixels (data's type is 'std::unique_ptr<char[]>')
  data = std::make_unique<char[]>(imgWidth * imgHeight * bitDepth * channels / 8);

  const unsigned long int rowLength = imgWidth * bitDepth * channels / 8;

  // Adding every pixel into previously allocated rows
  for (unsigned int i = 0; i < imgHeight; ++i) {
    // Preparing the rows to handle image's data
    rowPtrs[i] = (png_bytep)&data + ((imgHeight - i - 1) * rowLength);
  }

  // Recovering image data
  png_read_image(pngReadStruct, rowPtrs.data()); // /!\ Segfault here

  png_destroy_read_struct(&pngReadStruct, static_cast<png_infopp>(0), static_cast<png_infopp>(0));

从文件中获取的每个特征对我来说都很好,并且它刚才没有错误地工作;这可能是我在重构时犯的一个愚蠢的错误。

感谢您的帮助,请随时提出我错过的任何其他内容。抱歉长代码!

0 个答案:

没有答案