2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

svgやdrawioなどのXMLファイルの色をグレースケール化するツールを作りました

Last updated at Posted at 2024-11-07

はじめに

タイトルの通り、svg や drawio などの XML ファイルの色をグレースケール化するツールを作りました。SVG や CSS のフィルタ機能によるグレースケール化ではなく色自体を変更しています。

仕組みは単純に XML ファイルの中からタグに含まれている #FF0000 #00FF00 #0000FF のような形式の色を示す文字列をグレースケール化の計算式に当てはめて #4C4C4C #959595 #1D1D1D のような文字列に置換しているだけです。さすがに埋め込み画像は変換できないのであしからず。

実装

正規表現で色の部分を抽出し変換するという単純な内容なので説明するまでもないでしょう

grayscale
#!/usr/bin/env perl
use strict;
use warnings;

my $text = join("", <>);
$text =~ s/(<[^>]+>)/convert($1)/ge;
print $text;

sub convert {
    my ($text) = @_;
    $text =~ s/(?<![0-9a-z])[#]([0-9a-f]{6})(?![0-9a-z])/grayscale($1)/gei;
    return $text;
}

sub grayscale {
    my ($hex) = @_;
    my ($r, $g, $b) = map { hex($_) } ($hex =~ /../g);

    my $gray = int(0.299 * $r + 0.587 * $g + 0.114 * $b);
    return sprintf("#%02X%02X%02X", $gray, $gray, $gray);
}

使い方

$ grayscale image.svg

さいごに

元図自体はカラーで作成するが、モノクロのデータを(編集可能な形で)欲しいと思い作りました。最初はそのようなツールを探したのですが意外と見つからなくて困りました。よくよく考えてみればグレースケール化なんて単純な計算なわけで、自分で作ったほうが早かったですね。

ちなみに、画面上での確認は Windows や macOS のアクセシビリティ機能で画面全体をグレースケール化できるので、それを使えばソフトウェアの機能に依存せずにできます。Windows はショートカットキーがあるので切り替えも楽ですね。macOS はショートカットキー割り当てられないのだろうか?

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?