• category: swing folder: FontSilhouette title: Fontのアウトラインから輪郭を取得する tags: [Font, PathIterator, Icon, AffineTransform, Shape, JLabel] author: aterai pubdate: 2013-09-16T00:01:42+09:00 description: Fontから取得した字形の輪郭を抽出し、縁取りや内部の塗り潰しなどを行います。 image: https://lh5.googleusercontent.com/-kzMG9iEHFz4/UjWgNdHCh1I/AAAAAAAAB2A/0gpKBcNqz44/s800/FontSilhouette.png

概要

Fontから取得した字形の輪郭を抽出し、縁取りや内部の塗り潰しなどを行います。このサンプルは、java - 'Fill' Unicode characters in labels - Stack Overflowに投稿されているコードを参考にしています。

サンプルコード

private static Area getOuterShape(Shape shape) {
  Area area = new Area();
  Path2D path = new Path2D.Double();
  PathIterator pi = shape.getPathIterator(null);
  double[] coords = new double[6];
  while (!pi.isDone()) {
    int pathSegmentType = pi.currentSegment(coords);
    switch (pathSegmentType) {
    case PathIterator.SEG_MOVETO:
      path.moveTo(coords[0], coords[1]);
      break;
    case PathIterator.SEG_LINETO:
      path.lineTo(coords[0], coords[1]);
      break;
    case PathIterator.SEG_QUADTO:
      path.quadTo(coords[0], coords[1], coords[2], coords[3]);
      break;
    case PathIterator.SEG_CUBICTO:
      path.curveTo(coords[0], coords[1], coords[2],
                   coords[3], coords[4], coords[5]);
      break;
    case PathIterator.SEG_CLOSE:
      path.closePath();
      area.add(new Area(path));
      path.reset();
      break;
    default:
      System.err.println("Unexpected value! " + pathSegmentType);
      break;
    }
    pi.next();
  }
  return area;
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、チェスの駒の字形から輪郭を取得し、それを使って縁取り、内部の塗り潰しを行うIconJLabelに配置して表示しています。

字形(Shape)の輪郭は、Shape#getPathIterator(...)PathIteratorを取得し、開始点が一番外側にあるパスの集合をPath2Dに変換、Areaに追加することで作成しています。

参考リンク

コメント