MAKCim, да я всё это прекрасно понимаю, но не вижу никаких ошибок у себя. Несколько разных мануалов просмотрел - всё так должно быть. Вот, исходники. Класс:
Код | class aPng { public: aPng(); bool apLoadImage(char* path); void apClearData(); ~aPng(); int bpc; int w; int h; int channels; unsigned char* data; int ct; int it; int cot; int ft; int depth; int rowSize; Pixmap pm; }; |
Код | bool aPng::apLoadImage(char* path) { if (!path) return 0; FILE* file = fopen(path, "rb"); if (!file) { fprintf(stderr, "Can't open image file for reading \"%s\".\n", path); return 0; }
png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0); png_infop pngInfo = png_create_info_struct(png); png_init_io(png, file); png_read_info(png, pngInfo); png_get_IHDR(png, pngInfo, (png_uint_32*)&w, (png_uint_32*)&h, &bpc, &ct, &it, &cot, &ft); if (ct == PNG_COLOR_TYPE_GRAY) channels = 1; if (ct == PNG_COLOR_TYPE_GRAY_ALPHA) channels = 2; if (ct == PNG_COLOR_TYPE_RGB) channels = 3; if (ct == PNG_COLOR_TYPE_RGB_ALPHA) channels = 4; if (bpc == 16) png_set_swap(png); if ((ct == PNG_COLOR_TYPE_PALETTE) && (bpc <= 8)) png_set_palette_to_rgb(png); if (png_get_valid(png, pngInfo, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png); rowSize = w*channels*(bpc >> 3); int i; data = new unsigned char[h*rowSize]; unsigned char* row = data; for (i = 0; i < h; ++i) { png_read_row(png, (png_bytep)row, 0); row += rowSize; } png_read_end(png, 0); png_destroy_read_struct(&png, &pngInfo, 0); fclose(file);
return 1; } |
Естественно это самый простой код, направленный на то чтобы только попробовать открыть и вывести картинку.
Добавлено через 2 минуты и 32 секунды Где-то в мануалах упоминалось мол изначально окна не мог юзать больше 256 цветов. Может в этом дело? |