VS CODE 拡張機能 一式

エディタに何を使うか

永遠のテーマですよね。
学生時分にUnixLinuxを使っていた時は、Emacsを使っていました。クセのあるショートカットキーを使いこなすのがカッコイイと思っていましたし、今も思っています。Viは当時は存在すら知りませんでしたし、今は存在を知るに止まっています。ソッチ方面はある意味プログラミングよりもよっぽど底無し沼だと思っています。
学生でなくなってからはWindows使いになったのですが、Unixの余韻でEmacs(win版)とかxyzzyとかを使っていました。lispで拡張していくの面白いな、とは思っていました。
Windowsに染まっていくにつれ、秀丸エディタとかSakuraエディタなんかの割合が多くなっていきましたが、コード書く系はかろうじてxyzzyでした。
しかし、コード書いて走らせて楽しむことがなくなっていくにつれxyzzyからも離れていき、エディタにこだわるようなこともなくなりました。
仕事で使う時は他のツールとの兼ね合いもありSakuraエディタを、その他はせいぜいメモ帳で事足りるようになりました。

趣味プログラミング再始動

最近、一念発起して、趣味でプログラミングでもやってみようか、となりました。やはり最初の壁としてはエディタ何使う?ということでした。WinではなくMac(Linux動く!)ということで、いっちょViっとく?と思いましたが、Vi立ち上げてから30分ほど試して諦めました。ワタシはもうああいうものにこの身を捧げるほど若くもなく変態でもないのです。(Viを本気で使っている方は変態ではないかと思います。ワタシも学生の頃Emacsを本気で使っていた時は変態に見えたのでしょうか。本気Viと本気Emacsはどちらの方が変態度が高いのでしょうか。ワタシは7:3でViの方が変態だと思います。この場合の「変態」は褒め言葉です。)
そしてご多分に漏れず、VS Codeに落ち着きました。

VSCodeについて

Microsoftによるフリーソフトです。ワタシが調べた時点で滅茶苦茶評判が良く、コード書く系のエディタとしてはメインストリームになっていました。
はっきり言ってMicrosoft製のアプリケーションには良い印象はあまりないのですが、どうやらその印象は捨て去った方が良さそうでした。ワタシがやりたいのはプログラミングであってエディタ環境の構築ではないのですから、やはりそこは大多数の方が使っているものを導入すべきです。長いものに巻かれるときは自ら回転しながら巻き込まれてゆけば良いのです。
で、使ってみての感想ですが、大変安定していて使いやすいと思います。そしてなんと言っても拡張機能の多さ、これにつきます。エディタ環境構築に執念するつもりはないのですが、やはり触ってしまいますね。いろいろ試すの楽しいもんね。

現時点の拡張機能メモ

今日の更新の本題はここから下です。完全に個人的なメモです。
もうすでに大変出入りが激しく、既に何を試したことがあるかないか、わけがわからない状態です。今後もこのような状態は間違いなく続くと思われます。とりあえず現時点でインストールされている拡張機能とそのバージョンをメモしておこうと思います。

(2020年10月11日 本記事執筆時点)

これだけ。 POV-Rayがあるのは結構びっくりしました。ひょっとしてまだまだメジャーなのかPOV-Ray。
binaryviewerは2種類入ってるけど、使い勝手の点でどちらも決め手に欠ける感じです。
他は定番ばかりでしょうか。
メチャ少ないんだろうなと思う。
いろいろありすぎて楽しいから試すのは試すんですが、比較できるほど使い込む前にフィーリングですぐアンインストールしちゃいます。結果、ど定番以外は使ってないくらいなのかな。
そういえば、javaとかc/c++とかlispとかも入れたような気がしていたけどないな…。マボロシだったのか…。
はっきり言ってVS Codeも、ViやEmacsに負けず劣らず変態ですね。

直近の気になることとしては、SyntaxHighlight含む全体の見た目でピンとくるのが無いなあ、といったところでしょうか。
またWEBでガッツリ検索だな。これだけの人が使ってるから、絶対良いと思えるのがあるはずだ。

ネスレ ネスカフェ ゴールドブレンド バリスタ

肌寒くなってきました。
先日、お金が欲しいからアフィリエイトに登録しました、という記事を書きました。
これでワタシもブログ飯に一歩近づきました。しかし、いくら紹介の許可を得ても、実際に紹介しないことには何の金銭も発生しません。
さて何を紹介しようか、と考えてふと思いついたのが、タイトルのコーヒーマシンです。

コーヒー

個人的には、寒い日の朝イチで飲むブラックコーヒーの最初の一口には、なにものにも変え難い覚醒感があると思います。エネルギーが注入されたというか、スイッチが入ったというか。
この感覚は紅茶や日本茶では味わえませんでした。それ故、ワタシはコーヒー党で居続けていると言って良いでしょう。
コーヒー党の中でも、インスタント派、ドリップ派、エスプレッソ派などさまざま派閥が分かれます。そして、コーヒーを飲むということにどれだけリソースを割くか、という点についても、決して正解などあるはずもなく、自分にあったスタイルがなんであるか、日々研究です。
ワタシの場合、

  • インスタント各種
  • コーヒーメーカ
  • コーヒーミル&ドリッパー
  • エスプレッソマシン

などわたり歩き、今のところの最適解が『ネスレ バリスタ』です。
コーヒーマシンというそうです。少し厳密にいうと、「インスタントコーヒー自動入れ器」と言ったところでしょうか。専用のコーヒー粉をセットしておいて水を入れてボタンを押すと、インスタントコーヒーを作ってくれるというものです。

ワタシが購入したのはもう3年以上前です。すなわち、3年以上一軍に居続けているということです。 なお、上に貼ったのは何世代か前のものですね。これから購入される方は最新版も確認しましょう。

良いところ

良いと思うところを書き出してみます。

見た目がシャレてる

丸みを帯びたボディに落ち着いた色。ワタシのはレッドですが、決してケバケバしくはありません。シックな雰囲気はどのような場所にも溶け込むのではないでしょうか。

操作が楽

「電源ボタンON」「コースボタンON」の2アクションでコーヒーを淹れてくれます。電源ボタンONから準備が整うまで約20秒くらいかかります。ヒータの準備が整う時間でしょうか。
朝起きておもむろに電源ボタンONして、トーストを焼きつつマグカップを置いたくらいにコーヒー淹れる準備が整う、といったイメージです。なにかと忙しい朝にはとてもありがたいです。

メンテナンスが楽

1ヶ月に1回くらい、分解清掃します。小さく細い部品もあるので注意は必要ですが、全く難しいことはありません。

常に同じ味のコーヒーができる

これ、結構ポイント高いと思います。
例えば、コーヒーミル&ドリッパー運用では、豆の挽き方やドリップのやり方によってコーヒーの味や風味が変わると言われています。パラメータは無数にあり、特定の味を再現するのは困難(というかそのスキルを得るのに時間が必要)です。(そこが魅力でもあるわけですが)
その点バリスタは、常に同じコーヒー粉を常に同じ量の熱湯で入れてくれるので、味のばらつきは極小です。その安心感は、忙しい朝のストレスを極小にしてくれるものです。

肝心の味はどうなのか

ドリップ側かインスタント側かというと、完全にインスタント側です。ドリップが好きでインスタントが嫌いな方には合わないだろうと思います。あと、コーヒーが好きすぎていくらでも時間資源を投下できる、という方も、このマシンは買うべきでは無いと思います。
逆にそんな方でも無い限り、購入検討の価値はあります。コーヒーよく飲むけどそこまでハマるつもりはない、とか、コーヒーメーカー買って使ってるけどなにかと面倒くさいと思っている、みたいな方にはうってつけです。

他に悪いところは?

色と形については上記の如く褒めるところ多々ですが、注意しないといけないのはその大きさです。なんとなく想像するより大きめで、最初キッチンに置いた時は結構な存在感を示しました。デッドスペースもそれなりにできます。そういったことが気になる方は、熟考が必要です。

まとめ

ネスレバリスタの紹介をしました。ワタシのアフィリエイターへの第一歩ですね。ちょっとでも興味を持っていただければ、これ幸いです。

繰り返しますが、一言コーヒーが好きと言っても、そのグラデーションはピンキリで、本品は確実にライト層に向けてのものです。
特にちょっと背伸びをしたいライト層の方、お近くの家電量販店に行って大きさや存在感が許容できる方は、そのまま購入して持って帰ってきましょう。

地位と名誉

世の中は、地位と名誉が全てです。(核心)
地位と名誉があれば、あとは霞を食いながらでも生きていけます。(言い過ぎ)
それらがない人生なんて、ストローがないパック飲料のようなものです。(意味不)

ブログを運営する上での地位と名誉とは、具体的にどのようなものでしょうか?
そもそも金が欲しいとか書いている時点で地位も名誉もあるまい。
…というのは置いておいて。 以下、いつものように完全に個人の主観でお届けします。

地位

昨日にサクッと殴り書いた通り、
地位 = α × 継続期間 + β × 投稿数
で表すことができると思います。
αとβは誰もが心のなかに持っている偏見という名の係数です。

ポイントは、ブログの内容や読者数やアクセス数やはてブ数は関係ないということです。(負け惜しみではありません!)
我々はただ、継続期間と投稿数の数に対してのみ、ひれ伏すのです。

名誉

数値化するとしたら、得られたスターの数、読者数、アクセス数、はてブ数、などでしょうか。明確に数値となるので大変わかりやすいです。
バズった記事は数値とともにアーカイブされ、後世に語り継がれるのでしょう。何年前の記事でも、いっぱい参照されている記事は基本的に面白いもんね。
一方で、これら数値はその瞬間ごとで得られるものであり、その時が過ぎればそれはもう過去の数値となっていきます。そこは流石ネットの世界、鮮度が下がっていくのも早いです。過去の実績はそれはそれで大事ですが、やはりそのブログが色褪せずに鮮度を保つためには、常にある一定の数値を叩き出しておかないといけないのでしょう。常に新しいものが台頭してくる世界です。

まとめ

継続さえしていれば、そして記事の数が多ければ、それだけで地位は得ることができる。
しかし、その名誉を維持するためには、常に過去の栄光を塗り替えていかねばならないのです!

今日の記事は、昨日の記事の続きというか別の書き方というか…。昨日は、なんだか文章下手で言いたいこと言えてないなあ、と思ったのでリベンジのつもりでこの記事を書いています。継続は素晴らしいし継続してるだけで力をもつけど、形骸化と利権の温床になるとよくないよね、という話を書いてみようと思ったらこのザマです。日々反省、そして精進でございます。

継続は力

はてなブログさんについて

ブログを始めるまでは、ブログ=はてなブログだと思ってました。ブログ始める前にワタシがブックマーク入れていたブログは、軒並みはてなブログでした。芸能人がアメーバブログやってますが、あれは芸能の世界にコネがないと出来ないものだろうと思ってました。
実際はブログのサービスもさまざまあるようでです。ただ、無料で始めることのできるもののなかでは、はてなブログが一番シェア多いようです。プラットフォームとして盤石…かどうかはわかりませんが、かなり昔からおられるようです。もう本当に無知ですみません。たまたまですが、はてなブログでブログを始めることができてラッキーだったと思います。

継続は力

はてなブログのいろんなブログを見ていると、昔からずっとブログを書いてらっしゃる方も多くいて、凄いなあと思います。このブログなんてせいぜえ一月半ですが、中には当然10年20年と続けておられる方もいらっしゃいます。そんなブログを見つけて思うのは、凄いなあという感嘆と賞賛の気持ちと共に、「ワタシはこの人には一生勝てないんだろうな」という絶望感敗北感だったりします。ワタシがどんだけブログを続けてもその差は埋まりませんから。
「継続は力」と言いますが確かにその通りで、ただ続いているだけでそれは圧倒的な力であると感じます。中身とか量とか質とかは二の次です。継続していること、この一点が何事においても多くの価値を持つのだと感じています。
どれだけ質の高い記事を生み出すことができても、一瞬で蹂躙してしまうくらいの力があります。そしてそれは、ワタシ(すなわち継続期間短い方)が、一方的に感じるものです。もう、ただいるだけで脅威なわけです。

このブログもいつかはそうなりたいと憧れながら、更新する日々です。

お金がほしひ

タイトル、当たり前すぎて逆にインパクト強い気がする…。

ブログでお金を稼ぐ方法

ブログ開設一月半、やっとマトモに調べました。正直に申しますと「アドセンス」と「アフィリエイト」の違いがわかってませんでした。だって、なんとなく語感似てる気がするし、頭文字も同じだし…。
WEB見てて勝手に入ってくる広告が「アドセンス」で、サイト管理者が紹介してロイヤリティもらうのが「アフィリエイト」だって。日々、勉強でございます。

お金がほしい

大事なことなので繰り返し書いています。
ワタシ調べによると、アドセンスと言うともうそれはほぼ「Google AdSense」と同義のようです。
アドセンス広告を貼るためにはGoogleの審査を通過しないといけないようです。そしてGoogleに審査してもらうためにはGoogleにせめて存在してることを認識してもらわないとダメだそうです。それってどういうことだ? Google検索されてるかどうかか? でもこんなよくわからんサイト名ググられることなんて、そもそもないだろう。
と、思ってみましたが、どうやらGoogleクローラーというなんかよくわからんモノに捕まらないといけないらしい。
どうせ無理なんだろーなー、と思ってまだ申し込んでません。
はっきりいって、罷り間違って申請通って広告置けても、たぶんその広告は誰にも踏まれることはないでしょう。だってそんないっぱい人来ないし。
まあでも、いずれそのうち…。

ちょっとでもいいからお金が欲しい

切実なので何回でも書きます。
もうひとつのアフィリエイトの方。これは、かの有名な「もしもアフィリエイト」さんに登録しました。他にも何社かあるようですが、今のところ一社のみ。いやしかし、これでワタシも立派なアフィリエイターです。どんどんアフィリエイトしていこう。自分が良いと思ったものを紹介して、それ経由で紹介したものが買われたらロイヤリティいただけるということで、素晴らしいモデルだと思いました。

やっぱりいっぱいお金が欲しい

ブログには正直な想いを綴っていきたいと思っています。

どうやら、ブログで稼ぐ王道はどちらかというとGoogle AdSenseのようです。検索で流れてきた人たちにAdSense広告を踏んでもらうために、検索に引っかかりやすいブログをつくるそうです。なるほどねー確かに普段わからんことあったらまず検索するもんなー。
このブログなんて、ブログ名からして絶望的ですね。もし明日からブログ名変わってたら、そらはもう、そういうことです。

まとめ

要はお金が欲しいということです。
しかしまあなんですな。ブログって、思いの外続くものですな。日々テキトーなこと書いても続けてますって言える(自分のことです)のは、ある意味ユーザーフレンドリーな仕組みではないだろうか。でもお金を稼ごうと思ったら、もっとスパルタでないとダメなんだろうな。

言いたかったのは、お金が欲しいということだけでした。

英語力もほしひ?

英語堪能になりたくなる場面

英語ができないオッサンエンジニアはいま、どんなときに英語できるようになりたいのか。

海外の技術者と議論するとき

ワタシの職場はそもそもそういう機会がほぼゼロではあります。しかし全くのゼロではないのです。今まで延で片手で数え切れますが。
そんな場でも、通訳さんはいるので実際困ることはないです。しかし、話せないのが少数派であることは間違い無いのですよね。

海外の文献や雑誌を読みたいとき

技術畑にいますから、日本語になってないものを読みたい時も、ゼロとはいえないです。しかしこれも、非常に稀です。
いざそうなったら、もう必死になって翻訳サイトと睨めっこです。

プログラミングの調べ物をしているとき

趣味の話。
わからないことはまずは検索をしますが、英語のページしかヒットしないこともたまにあります。あとどうしてもマニュアルを読みたいとき。読むのに時間がかかるのは仕方ないにしても、困るのは、知りたいことが書かれているかどうかが、パパッと見て判断できないことです。
まあ、読まないと全く前に進めない、という状況になった経験はないですが。

英語堪能になりたいか

『英語サボらないでやってくれば良かったなあ』という軽い後悔があるかといえばそんなことは全くないのです。過去の自分にこの記事見せても『じゃあやっぱり英語の勉強はあんまやんなくて良いや』となっただろうなと思います。

期待すること

技術者は英語はできねばならない、TOEIC〇〇点以上取ってこい、なんてことは今もどこかで言われているのでしょうか。
英語話せるようになるのは良いことですが、個人的にはやはりテクノロジーが私たちの生活を(というかワタシを)楽にしてくれることに期待します。英語勉強キライ。

たぶん、リアルタイム自動翻訳はこの先2、3年で飛躍的に伸びることでしょう。
あ、でも英文の自動翻訳についてもおんなじ事思ったな。もう10年以上前に…。

pythonでpngファイル入出力

はじめに

一人でチマチマやってると、どこまでも深掘りしたくなりますね。次のステップへも行きたいので、ここらでまとめておきます。

必要なpython 環境は、最低限でよいです。
今回のワタシの環境は以下記事のようなものです。

macに入っているソフト、pythonのPackageリストをメモっとく - 放心ラボラトリ

どういったものをつくるか

ざっくりとは以下のような感じ。

  1. 指定したpngファイルを開く
  2. ヘッダの諸情報をゲット
  3. イメージ情報をゲット
  4. イメージ情報を渡して新たなpngファイルを出力
  5. 上記をclassとして実装する
  6. OpenCVやPILは使わない

今回作成したソースは、本記事の後ろの方に載せています。
特記事項的なものを先に書いておきます。

pngファイルのフォーマット

次のような構造になっています。

名前 長さ 備考
signature 8byte 必ず最初に現れる
IHDR 25byte 必ずsignatureの次に現れる
PLE --byte なくても良い
IDAT **byte 複数OK
... ... ...
IEND 4byte 必ず最後に現れる

大事な事をメモします。

  • 最初はかならずsignature:8byte
  • signatureの次は必ずIHDRチャンク:25byte
    ここに色んな情報が入ってる
  • イメージデータはIDATチャンクに入ってる
    IDATは複数持てる。すなわち分割できるという事
  • ファイルの終わりは必ずIENDチャンク:4byte
  • 任意でその他様々なチャンクを持てる
    本記事ではそれらは無視します
    必要に応じてWEB検索

IHDRの構造

以下のようになっています。大事な情報なので全部読み出しておきます。

内容 長さ 備考
データ長 4byte 常に13
チャンクタイプ 4byte 常に'IHDR'が格納されている
画像幅 4byte
画像高さ 4byte
bit深度 1byte
カラータイプ 1byte
圧縮メソッド 1byte
フィルターメソッド 1byte
インタレースメソッド 1byte
crc 4byte チャンクタイプとデータから計算

各チャンクの構造

以下のようになっています。先に書いたIHDRも同じです。

名前 長さ 備考
データ長 2byte データ長を格納
チャンク名 4byte 『IHDR』とか『IDAT』など
データ --byte チャンクのデータ
crc 4byte 謝り検知用

チャンク名が出てくるまで順番に読んでいって、チャンク名がヒットしたら戻ってデータ長を確認、そのデータ長分データを読む、でいけそうです。crcはファイルに書き込むときは計算しないといけませんが、本日は標準ライブラリを使います。

import zlib
crc32 = zlib.crc32(data)

これでdataに対するcrcを得ることができます。

個別のメモ

1.指定したpngファイルを開く

open('filename','rb')で開いてread()していきます。signatureの2〜4byte目に必ず『png』があるので、これを目印にしてpngか否か判断します。

2.ファイルヘッダの諸情報をゲット
struct.unpack_from(">33s", bytedata, offset)

を使います。バイトデータの任意の場所から任意の長さを、任意の型で取り出すことができます。
逆にバイトデータにして書き込むときは

struct.pack(">I",data)

を使います。 バイトリテラルについて詳細やりだすとそれだけで長くなりそうなので別の機会にしますが、今回のような低レベル処理をしたい時には滅茶苦茶便利だと思います。

3.イメージ情報をゲット

'IDAT'を探しながらstruct.unpack_from()で読み出していきます。読み出すたびにどんどん連結させていきます。最終的にはひとつの大きなIDATが出来ます。今後のため、一つになったIDATをgetするメソッドも実装しておきます。

4. イメージ情報を渡して新たなpngファイルを出力

これは、読み出したものをそのまま書き込めばよいです。ただし必須チャンクであるIHDR,IDAT,IENDしか書き込みません。そしてIDATは一つしか持たせません。元ファイルによりますが、多少は容量軽くなります。

まずは結果

以下のようなpng.pyというファイルを作成します。

import struct
import zlib

class png_img:
    def __init__(self,inputfile):
        self.f = open(inputfile,'rb')
        self.imgdata = self.f.read()
        #書き込み用にsignatureとIHDRを読み出しておく
        self.head = struct.unpack_from(">33s", self.imgdata, 0)
        #PNG画像か否か判断。PNG画像であれば各種データ読み出し。
        if struct.unpack_from(">3s", self.imgdata, 1) == (b'PNG',):
            self.i_width = struct.unpack_from(">I", self.imgdata, 16)
            self.i_height = struct.unpack_from(">I", self.imgdata, 20)
            self.bit_depth = struct.unpack_from(">B", self.imgdata, 24)
            self.color_type = struct.unpack_from(">B", self.imgdata, 25)
            self.comp_method = struct.unpack_from(">B", self.imgdata, 26)
            self.filter_method = struct.unpack_from(">B", self.imgdata, 27)
            self.interlace_method = struct.unpack_from(">B", self.imgdata, 28)
            self.crc = struct.unpack_from(">B", self.imgdata, 29)
            #IDATの読み出し。複数ある場合全て連結する。はIENDが現れるまで繰り返す
            self.count = 30
            self.idata_type = struct.unpack_from(">4s", self.imgdata, self.count)
            self.img_length = 0 #IDATの合計データ長
            self.img_data = b'' #IDATのデータ部が入る
            self.cnt = 0        #IDATチャンクの数を数える
            while self.idata_type != (b'IEND',):
                self.idata_type = struct.unpack_from(">4s", self.imgdata, self.count)
                if self.idata_type == (b'IDAT',):
                    self.idata_length = struct.unpack_from(">I",self.imgdata,self.count-4)
                    self.img_length += self.idata_length[0]
                    self.img_subdata = struct.unpack_from(">"+str(self.idata_length[0])+"s",self.imgdata,self.count+4)
                    self.img_data += self.img_subdata[0]
                    self.cnt += 1
                self.count += 1
            print('read OK','This Image is',self.count,'byte')
        else:
            print('This file is not PNG image')
        self.f.close()
    def outputPNG(self,outputfile):
        self.ff=open(outputfile,'wb')
        self.ff.write(struct.pack(">33s",self.head[0]))
        self.ff.write(struct.pack(">I",self.img_length))
        self.ff.write(struct.pack(">4s",b'IDAT'))
        self.ff.write(struct.pack(">"+str(self.img_length)+"s",self.img_data))
        self.ff.write(struct.pack(">I",zlib.crc32(b'IDAT' + self.img_data)))
        self.ff.write(struct.pack(">I",0))
        self.ff.write(struct.pack(">4s",b'IEND'))
        self.ff.write(struct.pack(">I",zlib.crc32(b'IEND')))
        self.ff.close()
    def printDATA(self):
        print('bit_depth =',self.bit_depth[0],'color_type =',self.color_type[0],
            'comp_method =',self.comp_method[0],'filter_method =',self.filter_method[0],
            'interlace_method =',self.interlace_method[0],'crc =',self.crc[0])
        print('width =',self.i_width[0],', height =',self.i_height[0])
        print('image data length =',self.img_length,' byte','IDAT THUNK cnt =',self.cnt)
    def getIDAT(self):
        return self.img_data
    def searchTNK(self,thunk):
        self.dmy1 = 0
        self.dmy2 = 0
        self.thunk_type = (b'',)
        while self.thunk_type != (b'IEND',):
            self.thunk_type = struct.unpack_from(">4s", self.imgdata, self.dmy1)
            if self.thunk_type == (thunk,):
                self.thunk_length = struct.unpack_from(">I",self.imgdata,self.dmy1-4)
                self.thunk_value = struct.unpack_from(">B",self.imgdata,self.dmy1+4)
                print(self.thunk_type[0],'length=',self.thunk_length[0],'value=',self.thunk_value[0])
                self.dmy2 += 1
            self.dmy1 += 1
        if self.dmy2 == 0:
            print('no thunk',thunk)

指定したチャンクがあるか探して、あれば表示もしてくれるsearchTNKメソッドも実装してみました。 同階層に以下内容のファイル作成します。元ファイル『lenna.png』も準備しておきます。

import png

inputfile='/Users/home/ip/lenna.png'
outputfile='/Users/home/ip/out.png'
p=png.png_img(inputfile)
p.printDATA()
p.outputPNG(outputfile)
p.searchTNK(b'sRGB')
p.searchTNK(b'PLTE')

実行結果は、terminalに以下のような表示がなされます。同階層にout.pngも生成されます。

read OK This Image is 521897 byte
bit_depth = 8 color_type = 6 comp_method = 0 filter_method = 0 interlace_method = 0 crc = 244
width = 512 , height = 512
image data length = 521078  byte IDAT THUNK cnt = 64
b'sRGB' length= 1 value= 0
no thunk b'PLTE'

なんとワタシのlennaさん、IDATチャンクが64もありました。

結び

pngファイルを読み込んで書き込むだけのものを作りました。やっていることはただの劣化コピーですね。OpenCVとかPILなどを使えば、劣化することなく数行で終えることができるでしょう。
しかし、今回ここに辿り着くまでに、

  • pngフォーマットの構成
  • pythonでのバイナリデータの扱い方

など、得られた知識は多くありました。

今後

pngファイル入出力関係は一旦一区切りです。ただ、crcのこととかbyteリテラルのこととかはまとめておきたいと思います。

さて、せっかくここまで作ったので、この流れで画像処理の基礎もやって見ようと思います。昨今流行りのDeepLearningの基礎の基礎の基礎くらいの内容です。

その前に得られたIDATの圧縮を解かねばなりませんね。ゆっくりやっていこうかと。

参考にさせていただいたサイト

こういったことをやりたい人は一定数いるのかなあ、という印象です。ワタシの記事よりわかりやすく正確なものがいっぱい。

PNGイメージのデータ構造を知ってみる(1) | エンジニアもどきの技術メモ
PNG イメージを自力でパースしてみる ~5/6 PNGフォーマット編~ - 自由研究ノート(仮)
pythonでバイナリデータを読む(PNGを例として) - Qiita

本サイト内関連記事

ダラダラのんびりやってきた記録。

pythonでPNGファイルを開いてみる - 放心ラボラトリ
pythonでpngファイルを開いてみる2 - 放心ラボラトリ
pythonでpngファイルを開いてみる3 - 放心ラボラトリ
pythonでpngファイルを開いてみる3.5 - 放心ラボラトリ