1

我正在编写一个纹理加载器,试图将它与 libpng 一起使用。我目前被一小部分难住了,这没有任何意义。我正在尝试获取图像的宽度和高度,并且发现返回的值没有保存。

unsigned int width;
unsigned int height;

...

width = png_get_image_width(png_ptr, info_ptr);
height = png_get_image_height(png_ptr, info_ptr);

printf("Width: %d\nHeight: %d\n\n", width, height);
printf("Width: %d\nHeight: %d\n\n", png_get_image_width(png_ptr, info_ptr), png_get_image_height(png_ptr, info_ptr));

这将返回以下内容:

Width: 0
Height: 0

Width: 1024
Height: 2048

那么有什么关系呢?这应该有效,但很明显不是。

所有相关代码的 Pastbin:http: //pastebin.com/9RP1iqqU

4

4 回答 4

1

从您在此处发布的代码中,我可能会假设您在类中的成员数据名称与成员函数TextureAtlas中的参数名称冲突。loadAtlas

class TextureAtlas {
    protected:
        unsigned int width;
        unsigned int height;

    public:

        TextureAtlas();
        virtual ~TextureAtlas();

        void loadAtlas(std::string loc, unsigned char tileWidth, unsigned char tileHeight);
};

void TextureAtlas::loadAtlas(std::string loc, unsigned char width, unsigned char height) {
    ...
    width = png_get_image_width(png_ptr, info_ptr);
    height = png_get_image_height(png_ptr, info_ptr);
    color_type = png_get_color_type(png_ptr, info_ptr);
    bit_depth = png_get_bit_depth(png_ptr, info_ptr);

    printf("Width: %d\nHeight: %d\n\n", width, height);
    printf("Width: %d\nHeight: %d\n\n", png_get_image_width(png_ptr, info_ptr), png_get_image_height(png_ptr, info_ptr));
    ...

要么重命名

unsigned int width;
unsigned int height;

或最后两个参数

void TextureAtlas::loadAtlas(std::string loc, unsigned char width, unsigned char height)
于 2012-07-12T16:35:27.427 回答
1

看起来你使用了错误的类型。 width并且不height应该png_uint_32unsigned int

更新:

在看到你的 pastebin 之后,看起来你正在传入width和传递height给函数,因为unsigned char它有效地隐藏了类成员widthheight并且可能不是你想要的,特别是因为unsigned char只能保存高达 255 的值,宽度和高度是 1024和 2048。

只需重命名函数参数。

于 2012-07-12T16:26:52.307 回答
0

我假设您正在尝试类成员调用的集合widthand height; 但是,您已经使用具有相同名称的函数参数隐藏了这些。它们有 type unsigned char,它(几乎可以肯定)不能保存大于 256 的值,这就是打印它们时看到零的原因。

您可以通过以下方式修复它:

  • 重命名参数或成员变量,以免它们发生冲突;或者
  • this->width作为和访问成员this->height
于 2012-07-12T16:36:25.553 回答
0

我认为您的问题可能在于您unsigned int用来存储返回类型的事实,而实际上返回类型是png_uint_32.

您是否尝试过这样做:

 png_uint_32 width = 0;
 png_uint_32 height = 0;

 width = png_get_image_width(png_ptr, info_ptr);
 height = png_get_image_height(png_ptr, info_ptr);

我还没有尝试过,但我怀疑这就是问题所在。

于 2012-07-12T16:25:25.100 回答