我在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));
从文件中获取的每个特征对我来说都很好,并且它刚才没有错误地工作;这可能是我在重构时犯的一个愚蠢的错误。
感谢您的帮助,请随时提出我错过的任何其他内容。抱歉长代码!