質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • C

    4370questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PNGのadler32の計算が合わない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 93

RideWitMe_jp

score 1

前提・実現したいこと

PNGの画像を読み込みんだアドラー32の値と計算した値が違うので解決したい。

プログラミング初心者です。PNGのデコード、エンコードのコードを自力で書いています。
アドラー32の計算をWikipediaなどのネット上に載っているコードを使ってみたが計算が合いません。

macプレビューではエンコードした画像を読み込んで表示できるので
表示を見ると読み込んだRGBAの値が違うという原因ではないように思います。
下のような画像です。

読み込んだ画像

発生している問題・エラーメッセージ

<参考>
読み込んだadler32->2085692484
計算したadler32->3944975942

該当のソースコード

unsigned long update_adler32(unsigned long adler,
                             unsigned char *buf, unsigned len)
{
    unsigned long s1 = adler & 0xffff;
    unsigned long s2 = (adler >> 16) & 0xffff;
    int n;

    for (n = 0; n < len; n++) {
        s1 = (s1 + buf[n]) % BASE;
        s2 = (s2 + s1)     % BASE;
    }
    return (s2 << 16) + s1;
}

unsigned char RGB[10000];//読み込んだrgbの値
unsigned long adler=1L;

adler=update_adler32(adler,RGB,10000);

試したこと

pngをデコードしRGBA値に対して計算し、読み込んだadler32の値と比べた
pngをエンコードし、計算した値を書き込んだが、チェックするソフトでははじかれる。
共にadler32の計算値が違うようです。
チェックしない?mac OS プレビューでは表示できます。

補足情報(FW/ツールのバージョンなど)

使用ソフトはxcode 10.1です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/04/15 16:26

    BASE は 65521 でしょうか?

    キャンセル

  • RideWitMe_jp

    2019/04/15 16:27

    すみません、65521です。

    キャンセル

  • jimbe

    2019/04/15 16:45

    見た目としては RFC1950 ( https://tools.ietf.org/html/rfc1950 ) の9ページ目のままのようですので, RGB の値のほうが問題かと思います.
    そちらをご確認しては如何でしょうか.

    キャンセル

  • RideWitMe_jp

    2019/04/15 17:11

    RGBの方が問題ですか。わかりました、別の画像などいろいろ確かめてみます。
    ご回答ありがとうございます。

    キャンセル

回答 1

checkベストアンサー

0

実際にpngからチャンクを切り出してinflateすると分かりますが
格納されているデータは50[行] * (4*50[列]+1) = 10050[byte]のデータです。

この1が何かと言うとこちらの解説によると行ごとのフィルターメソッド番号らしいです。

なお、切り出してinflateしたデータをadler32でハッシュ化すると7C512444が得られました。

(というか、zlibが勝手にadler32は付加するはずですが・・・)


各フィルターの解説

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/16 18:58

    フィルター1バイトの付加、zlib公式コードでの圧縮で正しい答えがでることは承知しておりました。
    単純な計算なので疑う余地がなさそうですが、アドラーの式に問題があるかと思いましたが、、、
    その他に問題があるか再検証してみます。
    実際に確認いただき、ありがとうございました。

    キャンセル

  • 2019/04/16 20:22

    フィルター番号を付加する必要があることを認識していたとのことですが

    > adler=update_adler32(adler,RGB,10000);
    1バイト付加されてませんよね?

    また、添付画像からinflateしたデータのadler32を質問のソースから計算できました。

    キャンセル

同じタグがついた質問を見る

  • C

    4370questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。