【マイクラ】画像 → ブロック【変換】

指定した画像を指定したサイズでマイクラのブロックに変換するプログラムを作りました。

(例)縦128 x 横85 ブロック

画像素材 : フリー写真素材ぱくたそ



マインクラフト 画像 ブロック変換

(JavaScpritで作ってます)


ざっくりした使い方

そんなに難しくないと思うので、使ってみればすぐに分かると思いますが、一応以下を参考にしてください。

項目について

【最大サイズ】
一辺の最大(最長)ブロックは320です

【ブロック名称】
Java版とBe版で微妙にブロックの呼び方が違うので、お使いのバージョンに合わせてください

【検出方法】
後述しますが、ブロックの近似色を探すのに3種類の方法があります。一長一短なので一番近い形のものを選ぶと良いと思います。

【画像データの読込】
画像データを選択してください。

変換方法

画像データを選択すると自動で設定された条件でマイクラのブロックに変換します。

変換後

【必要なブロック一覧】
必要な全ブロックの種類と数量の一覧です。

【完成画像】
ブロックに置き換えた完成画像です。数字は「必要なブロック一覧」のNo項目と同一です。
「サイズ変更」で小さくなるので全体のイメージが分かります。
「オリジナル」は元画像を縮小した画像です。

【下から〇段目】

一番下の段を基準としてブロックを横に並べる順で表記しています。
ブロック名の後の()数値は残りのブロック数です。0だとこれ以上、上の段でそのブロックは使いませんよー、という合図です。

【左から〇行目】

一番左の列を基準として ブロックを横に並べる順で表記しています。
ブロック名の後の()数値は残りのブロック数です。0だとこれ以上、右の行でそのブロックは使いませんよー、という合図です。


作ろうと思った経緯

子供の為です。
子供がマイクラをするようになってから「丹次郎を作って」「マリオを作って」「五条悟を作って」とせがまれるようになりました。

いちいち色を見ながら変換していくのが面倒くさくて作る事にしました。そして、作った後で、既にそんなサイトやアプリがあるのを知りました。

マイクラのブロックについて

マイクラのブロックはネットにある画像から平均値の色を検出して登録しています。

なので、微妙に色合いが変わるかもしれませんので、その時は教えてくれると助かります。

そのうち、ちゃんと自分でブロックを撮影してトリミングして、とかやるかもしれませんが面倒くさいので多分やりません(PS4版とSwitch版しか持っていないのでPCに取り込むのががが…)

あと一部のブロックしか登録していません。
例えば「マグマブロック」は光っているので周囲と親和性が取れないなぁー、とか、「樹皮を剥いだ原木」は端に薄い黒線があるので並べるとどうかなぁ、と思って登録を外しました。

まぁその辺はリクエストがあれば登録するのは簡単なので。


検出方法について

色々調べて沢山試しましたが、どれも一長一短だなぁ、という感じだったので使う側にお好きな方法を選択してもらうようにしました。

(せっかく作った変換プログラムを捨てるのがもったいないというのが一番の理由ですけど)

RGB

一番簡単な方法だし、それなりに良い結果が得られます。

Lab

Lab色空間はRGBより人間の感じる色差の違いを表すことが出来るそうです。

複合

RGBでも比較するしLabでの比較もする+コントラストも比較してみる。と試行錯誤の中で色々やったカオスなものをごった煮してます。

余談

ブロックの色は限られているので近似色を探すのは難しいのですが、なかでも色系統を把握するのが難しくて、「本当はオレンジ系なのに赤系を選んでしまう」「シアン系なのにグレー系になってしまう」という事が頻繁にありました。

なので、予め色系統を誘導できるように「色系統を決めるためのカラーリスト」と「色系統で揃えたブロックリスト」の2段階で検索をしています。

無駄かもしれないし、無駄じゃないかもしれない。

正直、この作業が正しいのか分かりませんが、「このブロックに変換したいよね」という事が上手くできているような(?)気がするので、そうしています。


プログラムの内容について

最初はPHPで作ったのですが、なにぶん共有サーバーですので、他の方に迷惑を掛けてしまうかも…と思い、JavaScriptに変換する事にしました。

以下は参照、流用させてもらったサイトです。

Calculating Color Contrast with PHP

Color difference algorithm – part 2

RGB to hex and hex to RGB

RGB to HSV color in javascript?