[java][ZXing]丸みのあるQRを作ってみた（味を占めた

# 本末転倒。。。
え～すけさんは、妻・子（2人）・ウーパールーパー・海水魚（カクレクマノミ）・犬（チワワ3匹）・ニホンカナヘビと同居しております。
そのなかでもカナヘビ（名：ドラ・チャン）との出会いは、庭に不法侵入してきたため確保して身柄を拘束しているというもので、現在も空調の効いた環境でヌクヌクと成長しております。
ただ野生育ちだったため、人工の高級エサ（コオロギペーストのペレット）をあまり食べてくれず、ヨーロッパイエコオロギ（通称：イエコ）をペットショップで50匹ぐらい仕入れて2～3日毎に5～10匹ぐらいをご飯としてあげていたのですが。。。

**ねぇ、なんであいつらすごい勢いで増えるの？**

いい餌に成長してもらうために、デカ目の衣装ケースの天井くり抜いて網戸ネットを貼り、隠れやすいように卵運搬するときの紙の入れ物入れて、カナヘビが食べなかったペレットやウーパーや海水魚のエサなどの高栄養のモノをあげて環境整えてあげたら、カナヘビが消費できないくらいに日々増殖してるんだが。。。
このままだとコオロギに我が家を乗っ取られてしまうため。。。

**そうだ消費者（爬虫類）を増やそう!!（やったね、家族が増えるね!!**

野生カナヘビが冬眠から覚めてくる春～夏まで待ってらんないので、
ヒョウモントカゲモドキ（レオパードゲッコー）（通称：レオパ）かフトアゴヒゲトカゲあたりをお迎えしようか検討中。
※フトアゴは適温高めで光熱費とかヤバそうなのでレオパが有力
※繁殖させたいからオス・メス揃えたい（餌が足りなくなる未来


# ZXing（QRだけ）極めたわ（分かってない
〇〇極めた　→　わからなくなる　→　ちょっとわかる　
みたいな、IT屋にありがちな現象を**ダニング=クルーガー効果**と言うみたいです。

[前回の記事](https://qiita.com/AsilHatake/items/cbd5f00b7fab5e16a8e7)でQRの見た目を文字で変えたろうみたいなことをしていましたが、
■を渡すと以下のようなスッカスカなQRが出来てしまい、なんともしょぼい感じになってしまっていた。
<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/bdf5f11f-a518-a1a2-8dcb-87da910a1f84.png">

※「鬱」を渡すと割とギッシリ感がますね！
<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/fbf75c03-c407-0cbd-65a5-ee36b4654118.png">

# そんなわけで文字じゃなくて画像（角丸四角）で表現したいなぁ
![roundSc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/d7474584-5318-c729-0a3f-03a73d255943.png)

今回は↑みたいな感じのヤツを作ってみるよ
- 左右や上下が塗りつぶされていたらくっつける
- 単品のときは●にする

## ソース
```java:好きに加工すればいいよ(ﾆｯｺﾘ

  public static void roundSc(String contents) throws Exception {
    QRCodeWriter w = new QRCodeWriter();
    BitMatrix matrix = w.encode(contents, BarcodeFormat.QR_CODE, 25, 25, Map.of(
        EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q,
        EncodeHintType.MARGIN, 0,
        EncodeHintType.CHARACTER_SET, "UTF-8"));
    int width = matrix.getWidth();
    int height = matrix.getHeight();
    int objSize = 10;

    BufferedImage bufferedImage = new BufferedImage(width * objSize, height * objSize, BufferedImage.TYPE_INT_RGB);

    Graphics2D g = bufferedImage.createGraphics();
    g.setColor(java.awt.Color.WHITE);
    g.fillRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setColor(java.awt.Color.BLACK);
    IntStream.range(0, height).forEach(hei -> {
      BitArray prevRow = hei == 0 ? null : matrix.getRow(hei - 1, null);
      BitArray nowRow = matrix.getRow(hei, null);
      BitArray nextRow = hei + 1 == height ? null : matrix.getRow(hei + 1, null);
      IntStream.range(0, width).forEach(wid -> {
        if (nowRow.get(wid)) {
          int posWid = wid * 10;
          int posHei = hei * 10;
          // まず●を書く
          g.fillArc(posWid, posHei, objSize, objSize, 0, 360);
          if (wid == 0 ? false : nowRow.get(wid - 1)) {
            // 1つ手前も黒だった場合、左端を塗りつぶす
            g.fillRect(posWid, posHei, 5, 10);
          }
          if (wid + 1 == width ? false : nowRow.get(wid + 1)) {
            // 次も黒だった場合、右端を塗りつぶす
            g.fillRect(posWid + 5, posHei, 5, 10);
          }
          if (prevRow == null ? false : prevRow.get(wid)) {
            // 上も黒だった場合、上を塗りつぶす
            g.fillRect(posWid, posHei, 10, 5);
          }
          if (nextRow == null ? false : nextRow.get(wid)) {
            // 下も黒だった場合、下を塗りつぶす
            g.fillRect(posWid, posHei + 5, 10, 5);
          }
        }
      });
    });
    ImageIO.write(bufferedImage, "png", new File("./roundQR.png"));
  }
```

## 解説
出だしとかループ周りとかは[前回の記事](https://qiita.com/AsilHatake/items/cbd5f00b7fab5e16a8e7)とほぼほぼ一緒ですが、
`Graphics2D`の`fillArc`と`fillRect`を使って図形をペタペタ貼っていくという作りにしてます。

まずは対象位置が■対象だった場合、`Graphics2D.fillArc`を使って●を設定
それだけだと●●●みたいな感じに繋がらないため、
その位置から上下左右が塗られているかどうかをチェックして、
状態に寄って余白部分を`Graphics2D.fillRect`を使って塗りつぶしていくという単純な作りとなってます。
1つのブロックのサイズを10としているため、以下のような感じに処理を入れています。
※方眼紙をイメージするとわかりやすいかも

- 左も⚫️：ブロックの左半分を■で塗りつぶす
- 右も⚫️：ブロックの右半分を■で塗りつぶす
- 上も⚫️：ブロックの上半分を■で塗りつぶす
- 下も⚫️：ブロックの下半分を■で塗りつぶす

ね、やってることはクソ単純で簡単でしょ？
※色の重ね塗りみたいな感じで気持ち悪い書き方になってるかもしれんが。。。

真ん中に画像出したいとかであれば、前回記事を参考にしてもらえれば幅が広がりングだね！