1

libpngを使用しようとして、テクスチャローダーを作成しています。私は現在、1つの小さな部分に困惑していますが、それは意味がありません。画像の幅と高さを取得しようとしていますが、戻り値が保存されていないことがわかりました。

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

それで、取引は何ですか?これは機能するはずですが、明らかにそうではありません。

すべての関連コードのパストビン:http://pastebin.com/9RP1iqqU

4

4 に答える 4

1

間違ったタイプを使用しているようです。 widthしてheightはいけませpng_uint_32unsigned int

アップデート:

ペーストビンを見た後、クラスのメンバーを効果的に隠している関数を渡しwidthているように見えますが、特に、 255までの値しか保持できず、幅と高さが1024であるため、おそらく必要なものではありません。および2048。heightunsigned charwidthheightunsigned char

関数パラメーターの名前を変更するだけです。

于 2012-07-12T16:26:52.307 に答える
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;

またはの最後の2つのパラメータ

void TextureAtlas::loadAtlas(std::string loc, unsigned char width, unsigned char height)
于 2012-07-12T16:35:27.427 に答える
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 に答える
0

width私はあなたがクラスのメンバーが呼んだセットを試していると仮定しますheight; ただし、同じ名前の関数パラメーターでこれらを非表示にしました。これらにはタイプunsigned charがあり、(ほぼ確実に)256を超える値を保持できません。そのため、印刷するとゼロが表示されます。

あなたはそれを修正することができます:

  • 引数またはメンバー変数の名前を変更して、衝突しないようにします。また
  • this->widthおよびとしてメンバーにアクセスするthis->height
于 2012-07-12T16:36:25.553 に答える