0
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?

去年より詳細にPHPで画像ファイルの色の分類をしてみた

Last updated at Posted at 2025-12-14

1. はじめに

 こんにちは。:grinning:
 CYBIRD Advent Calendar 2025の15日目担当の@suzu_ayaです。
 14日目は@R_araiさんの「AIを使ってサクッとシェルスクリプトで自動化した話」でした。
 AIによるコード生成は使い方さえ誤らなければ、初心者が技術を身に着けるのに非常に有用なのでは、と考えさせられますね。
 今回は、私も一部コードでGeminiを使用しています。

2. 概要

 昨年作成した画像の色判別をもうちょっと使いやすく&色判別が正確にできないかな、ということで改造をしていきます。
 以前の記事はこちらです。
 昨年は画像ファイルを指定して、その画像ファイルは何色が多くを占めているのか、というような色判別を行う実装をしました。
 今年は、画像ファイルを直接指定ではなく、ディレクトリ内の画像ファイルを全て取得して、まとめて色判別した方がちょっとは使いやすくなるのでは、ということと、もっと細かく色を分類すれば正確に色判別ができるのでは、と思いました。

3. 準備

 昨年の記事を参考に準備いただければいいかなと思います。
 私は相変わらずWindows環境です。ちなみに周りはみんなMacですね……。:rolling_eyes:

PHP GDライブラリ

 開発用のPCを新しくしたのでPHPを入れ直したのですが、コメントアウトを外す対象がgd2ではなくgdになってました。
 WindowsのPHPのバージョンが7→8になったことで変更があったようです。

Windows では、php_gd2.dll の名前が、php_gd.dll に変更されました。

 https://www.php.net/manual/ja/migration80.incompatible.php

php.ini
;extension=fileinfo
- ;extension=gd
+ extension=gd
;extension=gettext
...
- ;extension=exif
+ extension=exif

4. PHPで色判定(改)

1. ディレクトリ指定して画像ファイルを再帰的に取得する

 PHPで再帰的にファイル取得する処理の実装方法をGeminiに質問したところ、RecursiveDirectoryIteratorRecursiveIteratorIteratorを使え、と返ってきました。
 また、今回は画像ファイルのみを対象にしたかったので、RecursiveRegexIteratorも合わせて使用することにしました。
 
 Geminiの回答を元に実装した画像ファイル取得処理はこちら。
 

FileFinder.php
class FileFinder
{
	/**
	 * 引数で渡されたディレクトリを再帰的に検索し、画像ファイル(jpg|jpeg|png)を配列に入れて返却する。
	 *
	 * @param string $path 検索対象のディレクトリ
	 * @return array 検索した画像ファイルが入った配列
	 **/
	public function findImageFile(string $path): array
	{
		// 1. RecursiveDirectoryIterator: 再帰検索の基盤
		$directory = new RecursiveDirectoryIterator(
			$path,
			RecursiveDirectoryIterator::SKIP_DOTS // '.' と '..' をスキップ
		);

		// 2. RecursiveIteratorIterator: 再帰検索を平坦化して反復処理を容易にする
		$iterator = new RecursiveIteratorIterator(
			$directory,
			RecursiveIteratorIterator::SELF_FIRST // まずディレクトリ自身、次に中身を処理
		);

		// 3. RegexIterator: 特定の拡張子でフィルタリング
		// \. (ドット) の後に (jpg|jpeg|png) が来て、文字列の末尾 ($) に一致するファイル名にマッチ
		// i: 大文字小文字を無視 (例: .JPG も対象にする)
		$regex = new RegexIterator(
			$iterator,
			'/(\.jpe?g|\.png)$/i',
			RegexIterator::MATCH
		);

		$files = [];

		// フィルタリングされた結果を配列に格納
		foreach ($regex as $value) {
			// 今回はSplFileInfoオブジェクトをそのまま格納
			if ($value instanceof SplFileInfo && $value->isFile()) {
			// 0バイトファイルおよび画像ファイルに偽装したおかしなファイルはスキップ
			if ($value->getSize() === 0 || !in_array(exif_imagetype($value->getRealPath()), [IMAGETYPE_PNG, IMAGETYPE_JPEG])) {
				continue;;
			}
				$files[] = $value;
			}
		}

		return $files;
	}
}

 ファイルの取得はこれでOK。
 正規表現のマッチングだけだと、隠しファイル形式の.jpegとかは取得できてしまいそうなので、exif_imagetype()を使用して画像ファイル以外は除外しています。
 また、そもそも0バイトファイルは色判別もできないのでこちらも併せて除外します。

2.平均色を抽出する(改)

 平均色の抽出は基本的に昨年の記事と変わりありません。
 今回は1で取得したファイルのリストをループの処理でまとめて処理を行うので、exif_imagetype()でファイル形式の判別を追加しています。
 それ以外は特に処理の変更はありません。

Color.php
class Color
{
    /**
	 * 指定のパスの画像を読み込んで、画像の平均色のRGB値を取得する。
	 *
	 * @param string $filepath 読み込み画像のパス
	 * @return ?array RGB値の連想配列
	 */
	public function get_img_average_color(SplFileInfo $file): ?array
	{
		$img;
		
		// 画像読み込み
		// 基本はpng or jpegしか取得しないようにしている
		if (exif_imagetype($file->getRealPath()) === IMAGETYPE_PNG) {
			$img  = imagecreatefrompng($file->getRealPath());
		} elseif (exif_imagetype($file->getRealPath()) === IMAGETYPE_JPEG) {
			$img  = imagecreatefromjpeg($file->getRealPath());
		} else {
			return null;
		}

		$width = imagesx($img); // 画像サイズ(横)
		$height = imagesy($img); // 画像サイズ(縦)
		
		$sum_r = 0;
		$sum_g = 0;
		$sum_b = 0;
		
		$pick_count = 0;
		// 大きい画像を考慮して、位置を2ずつ飛ばす
		for ($i = 0; $i < $height; $i+=2) { 
			for ($j = 0; $j < $width; $j+=2) {
				// 指定位置の色を取得
				$rgb = imagecolorat($img, $j, $i);
				// 可読形式で再取得
				$color_info = imagecolorsforindex($img, $rgb);
				
				// 透過部分はスキップ
				if ($color_info['alpha'] >= 127)
				{
					continue;
				}
				
				$sum_r += $color_info['red'];
				$sum_g += $color_info['green'];
				$sum_b += $color_info['blue'];
				$pick_count++;
			}
		}
		
		// 合算したRGBの各色情報を色取得した数で割って10進数カラーコードに
		return ['red' => (int)round($sum_r / $pick_count)
				, 'green' => (int)round($sum_g / $pick_count)
				, 'blue' => (int)round($sum_b / $pick_count)];
	}
}

3.代表値にまとめる(改)

 前回はまとめる代表値は4つでしたが、今年はWeb216色を目指して、代表値は6つ(6 * 6 * 6 = 216)に増やしました。

color.php
class Color
{
	// RGB値丸め用のリスト
	const RGB_ROUND_LIST = [
		['value' => 0, 'min' => 0, 'max' => 25],
		['value' => 51, 'min' => 26, 'max' => 76],
		['value' => 102, 'min' =>77, 'max' => 127],
		['value' => 153, 'min' => 128, 'max' => 178],
		['value' => 204, 'min' => 179, 'max' => 229],
		['value' => 255, 'min' => 213, 'max' => 255]
	];
	
	/**
	 * 10進数のRGB値から丸めた値を返す。
	 * 一定範囲の値を代表値に丸める。
	 *
	 * @param int $color_value 10進数RGB値
	 * @return int 丸めたRGB値
	 */
	public function round_color(int $color_value): int
	{
		foreach (self::RGB_ROUND_LIST as $round_info)
		{
			if ($color_value >= $round_info['min'] && $color_value <= $round_info['max'])
			{
				return $round_info['value'];
			}
		}
	}
}

 代表値が216色に増えたことで、代表色のカテゴライズが大変になりましたが、Geminiが頑張ってくれました。

4.色を判定する(改)

 最後に、代表値によせた色が何色なのか判定します。
 色の分類は、基本色彩語を元に11色(赤、青、黄、緑、紫、オレンジ、茶、ピンク、灰、白、黒)としました。これは昨年と変わらずです。
 Geminiとレスバをしながら、何とか216色を↑の11色のカテゴリに分類しました。

color.php
class Color
{
	// 色のカテゴリリスト
	// カテゴリ分類は基本色彩語を元にしている。カラーコードの分類は主にGemini(ただし、不足部分は独断)
	const COLOR_CATEGORY = [
		'black' => ['#000000'],
		'gray' => ['#333333', '#666666', '#999999', '#CCCCCC'],
		'white' => ['#FFFFFF'],
		'red' => ['#FF0000', '#FF0033', '#FF3300', '#FF3333', '#CC0000', '#CC0033', '#CC3300', '#CC3333', '#990000', '#993300', '#660000', '#663300', '#FF6600', '#FF6633', '#CC6600', '#CC6633', '#996600', '#666600', '#FF0066', '#CC0066', '#990066', '#660066', '#FF3366', '#CC3366', '#660033', '#990033', '#993366', '#CC6666', '#FF6666'],
		'orange' => ['#FF9900', '#FF9933', '#FF9966', '#FFCC00', '#FFCC33', '#FFCC66', '#FFFF00', '#FFFF33', '#FFFF66', '#CC9900', '#CC9933', '#CC9966', '#CCCC00', '#CCCC33', '#CCCC66', '#999900', '#999933', '#FFCC99'],
		'yellow' => ['#FFFF99', '#FFFFCC'],
		'green' => ['#00FF00', '#33FF00', '#66FF00', '#99FF00', '#CCFF00', '#00FF33', '#33FF33', '#66FF33', '#99FF33', '#CCFF33', '#00FF66', '#33FF66', '#66FF66', '#99FF66', '#CCFF66', '#00FF99', '#33FF99', '#66FF99', '#99FF99', '#CCFF99', '#00FFCC', '#33FFCC', '#66FFCC', '#99FFCC', '#CCFFCC', '#00FFFF', '#33FFFF', '#66FFFF', '#99FFFF', '#CCFFFF', '#00CCFF', '#33CCFF', '#66CCFF', '#99CCFF', '#CCCCFF', '#00CC00', '#33CC00', '#66CC00', '#99CC00', '#00CC33', '#33CC33', '#66CC33', '#99CC33', '#00CC66', '#33CC66', '#66CC66', '#99CC66', '#00CC99', '#33CC99', '#66CC99', '#99CC99', '#00CCCC', '#33CCCC', '#66CCCC', '#99CCCC', '#009900', '#339900', '#669900', '#009933', '#339933', '#669933', '#009966', '#339966', '#669966', '#009999', '#339999', '#669999', '#006600', '#336600', '#006633', '#336633', '#006666', '#336666', '#999966', '#003300', '#003333', '#CCCC99'],
		'blue' => ['#0000FF', '#3300FF', '#6600FF', '#0033FF', '#3333FF', '#6633FF', '#0066FF', '#3366FF', '#6666FF', '#9966FF', '#0099FF', '#3399FF', '#6699FF', '#9999FF', '#0000CC', '#3300CC', '#6600CC', '#0033CC', '#3333CC', '#6633CC', '#0066CC', '#3366CC', '#6666CC', '#0099CC', '#3399CC', '#6699CC', '#9999CC', '#000099', '#330099', '#660099', '#990099', '#CC0099', '#003399', '#333399', '#666699', '#000033', '#000066', '#003366', '#006699', '#333366', '#336699'],
		'purple' => ['#FF00FF', '#FF33FF', '#FF66FF', '#FF99FF', '#FFCCFF', '#CC00FF', '#CC33FF', '#CC66FF', '#CC99FF', '#9900FF', '#9933FF', '#FF33CC', '#FF66CC', '#CC00CC', '#CC33CC', '#CC99CC', '#9900CC', '#9933CC', '#9966CC', '#993399', '#663399', '#996699', '#330066', '#663366'],
		'pink' => ['#FF0099', '#FF3399', '#FF6699', '#FF9999', '#CC0099', '#CC3399', '#CC6699', '#CC9999', '#FFCCCC', '#FF99CC', '#FF00CC', '#CC66CC'],
		'brown' => ['#993333', '#996633', '#663333', '#666633', '#333300', '#330000', '#330033', '#996666'],
	];

	/**
     * 10進数のRGB値を16進カラーコードに変換する。
     *
     * @param int $r 10進数R値
     * @param int $g 10進数G値
     * @param int $b 10進数B値
     * @return string 16進カラーコード
     */
    public function convert_rgb_to_hex_color_code(int $r, int $g, int $b)
    {
        return '#' . dechex($r) . dechex($g) . dechex($b);
     }
	
	/**
	 * 16進カラーコードが何色かを取得する。
	 *
	 * @param string $color_code 16進カラーコード
	 * @return string 色名
	 */
	public function get_color_category_name(string $color_code): string
	{
		foreach (self::COLOR_CATEGORY as $category_name => $color_list)
		{
			if (in_array(strtoupper($color_code), $color_list))
			{
				return $category_name;
			}
		}
	}
}

 カラーコードの代表色以外は、ほとんど変更ありません。

コード全文

 各関数を順番に実行していけば、色の判定までできます。
 ファイル検索については↑に全文記載していますので割愛します。

color.php
class Color
{
   // RGB値丸め用のリスト
   const RGB_ROUND_LIST = [
   	['value' => 0, 'min' => 0, 'max' => 25],
   	['value' => 51, 'min' => 26, 'max' => 76],
   	['value' => 102, 'min' =>77, 'max' => 127],
   	['value' => 153, 'min' => 128, 'max' => 178],
   	['value' => 204, 'min' => 179, 'max' => 229],
   	['value' => 255, 'min' => 213, 'max' => 255]
   ];
   
   // 色のカテゴリリスト
   // カテゴリ分類は基本色彩語を元にしている。カラーコードの分類は独断
   const COLOR_CATEGORY = [
   	'black' => ['#000000'],
   	'gray' => ['#333333', '#666666', '#999999', '#CCCCCC'],
   	'white' => ['#FFFFFF'],
   	'red' => ['#FF0000', '#FF0033', '#FF3300', '#FF3333', '#CC0000', '#CC0033', '#CC3300', '#CC3333', '#990000', '#993300', '#660000', '#663300', '#FF6600', '#FF6633', '#CC6600', '#CC6633', '#996600', '#666600', '#FF0066', '#CC0066', '#990066', '#660066', '#FF3366', '#CC3366', '#660033', '#990033', '#993366', '#CC6666', '#FF6666'],
   	'orange' => ['#FF9900', '#FF9933', '#FF9966', '#FFCC00', '#FFCC33', '#FFCC66', '#FFFF00', '#FFFF33', '#FFFF66', '#CC9900', '#CC9933', '#CC9966', '#CCCC00', '#CCCC33', '#CCCC66', '#999900', '#999933', '#FFCC99'],
   	'yellow' => ['#FFFF99', '#FFFFCC'],
   	'green' => ['#00FF00', '#33FF00', '#66FF00', '#99FF00', '#CCFF00', '#00FF33', '#33FF33', '#66FF33', '#99FF33', '#CCFF33', '#00FF66', '#33FF66', '#66FF66', '#99FF66', '#CCFF66', '#00FF99', '#33FF99', '#66FF99', '#99FF99', '#CCFF99', '#00FFCC', '#33FFCC', '#66FFCC', '#99FFCC', '#CCFFCC', '#00FFFF', '#33FFFF', '#66FFFF', '#99FFFF', '#CCFFFF', '#00CCFF', '#33CCFF', '#66CCFF', '#99CCFF', '#CCCCFF', '#00CC00', '#33CC00', '#66CC00', '#99CC00', '#00CC33', '#33CC33', '#66CC33', '#99CC33', '#00CC66', '#33CC66', '#66CC66', '#99CC66', '#00CC99', '#33CC99', '#66CC99', '#99CC99', '#00CCCC', '#33CCCC', '#66CCCC', '#99CCCC', '#009900', '#339900', '#669900', '#009933', '#339933', '#669933', '#009966', '#339966', '#669966', '#009999', '#339999', '#669999', '#006600', '#336600', '#006633', '#336633', '#006666', '#336666', '#999966', '#003300', '#003333', '#CCCC99'],
   	'blue' => ['#0000FF', '#3300FF', '#6600FF', '#0033FF', '#3333FF', '#6633FF', '#0066FF', '#3366FF', '#6666FF', '#9966FF', '#0099FF', '#3399FF', '#6699FF', '#9999FF', '#0000CC', '#3300CC', '#6600CC', '#0033CC', '#3333CC', '#6633CC', '#0066CC', '#3366CC', '#6666CC', '#0099CC', '#3399CC', '#6699CC', '#9999CC', '#000099', '#330099', '#660099', '#990099', '#CC0099', '#003399', '#333399', '#666699', '#000033', '#000066', '#003366', '#006699', '#333366', '#336699'],
   	'purple' => ['#FF00FF', '#FF33FF', '#FF66FF', '#FF99FF', '#FFCCFF', '#CC00FF', '#CC33FF', '#CC66FF', '#CC99FF', '#9900FF', '#9933FF', '#FF33CC', '#FF66CC', '#CC00CC', '#CC33CC', '#CC99CC', '#9900CC', '#9933CC', '#9966CC', '#993399', '#663399', '#996699', '#330066', '#663366'],
   	'pink' => ['#FF0099', '#FF3399', '#FF6699', '#FF9999', '#CC0099', '#CC3399', '#CC6699', '#CC9999', '#FFCCCC', '#FF99CC', '#FF00CC', '#CC66CC'],
   	'brown' => ['#993333', '#996633', '#663333', '#666633', '#333300', '#330000', '#330033', '#996666'],
   ];

   /**
    * 指定のパスの画像を読み込んで、画像の平均色のRGB値を取得する。
    *
    * @param string $filepath 読み込み画像のパス
    * @return array RGB値の連想配列
    */
   public function get_img_average_color(SplFileInfo $file): ?array
   {
   	$img;
   	
   	// 画像読み込み
   	// 基本はpng or jpegしか取得しないようにしている
   	if (exif_imagetype($file->getRealPath()) === IMAGETYPE_PNG) {
   		$img  = imagecreatefrompng($file->getRealPath());
   	} elseif (exif_imagetype($file->getRealPath()) === IMAGETYPE_JPEG) {
   		$img  = imagecreatefromjpeg($file->getRealPath());
   	} else {
   		return null;
   	}

   	$width = imagesx($img); // 画像サイズ(横)
       $height = imagesy($img); // 画像サイズ(縦)
      
       $sum_r = 0;
       $sum_g = 0;
       $sum_b = 0;
       
       $pick_count = 0;
       // 大きい画像を考慮して、位置を2ずつ飛ばす
       for ($i = 0; $i < $height; $i+=2) { 
           for ($j = 0; $j < $width; $j+=2) {
               // 指定位置の色を取得
               $rgb = imagecolorat($img, $j, $i);
               // 可読形式で再取得
               $color_info = imagecolorsforindex($img, $rgb);
               
               // 透過部分はスキップ
               if ($color_info['alpha'] >= 127)
               {
                   continue;
               }
               
               $sum_r += $color_info['red'];
               $sum_g += $color_info['green'];
               $sum_b += $color_info['blue'];
               $pick_count++;
           }
       }
      
       // 各色合計値を色取得した数で割って10進数RGBに
       return ['red' => (int)round($sum_r / $pick_count)
               , 'green' => (int)round($sum_g / $pick_count)
               , 'blue' => (int)round($sum_b / $pick_count)];
   }

   /**
    * 10進数の値から代表値によせた値を返す。
    * 一定範囲の値を代表値によせる。
    *
    * @param int $color_value 10進数RGB値
    * @return int 代表値によせたRGB値
    */
   public function round_color(int $color_value)
   {
       foreach (self::RGB_ROUND_LIST as $round_info)
       {
           if ($color_value >= $round_info['min'] && $color_value <= $round_info['max'])
           {
               return $round_info['value'];
           }
       }
   }

   /**
    * 10進数のRGB値を16進カラーコードに変換する。
    *
    * @param int $r 10進数R値
    * @param int $g 10進数G値
    * @param int $b 10進数B値
    * @return string 16進カラーコード
    */
   public function convert_rgb_to_hex_color_code(int $r, int $g, int $b)
   {
       return '#' . dechex($r) . dechex($g) . dechex($b);
    }
   
   /**
    * 16進カラーコードが何色かを取得する。
    *
    * @param string $color_code 16進カラーコード
    * @return string 色名
    */
   public function get_color_category_name(string $color_code): string
   {
   	foreach (self::COLOR_CATEGORY as $category_name => $color_list)
   	{
   		if (in_array(strtoupper($color_code), $color_list))
   		{
   			return $category_name;
   		}
   	}
   }
}

5. 実際にやってみる

 実際にこのコードを使って画像が何色なのか、を判定してみます。
 昨年と同じ画像を使用しているので、色分類を詳細にした結果の違いがどうなるのか楽しみです。
 
 1枚目は鹿。:deciduous_tree:
 shika.jpg
 昨年の実装の判別結果はこちら。
 平均色:#7b6c89 代表色:#55aa55 判定結果:green
 今年の判別結果はこちら。
 平均色:#7b6c89 代表色:#669966 判定結果:green
 代表色が変わりましたね。代表色を増やしたところ、より暗い緑になりました。
 ただ、どちらも判定結果は緑で正確かなと思います。ベースは山の緑なので。

 2枚目はネコチャン。:smiley_cat:
 neko1.jpg
 昨年の実装の判別結果はこちら。
 平均色:#aa9ba8 代表色:#aaaaaa 判定結果:gray
 今年の実装の判別結果はこちら。
 平均色:#a99ba8 代表色:#999999 判定結果:gray
 今年も灰色!代表色がちょっぴり濃い灰色に変わりました。
 そして、平均色が違う…なぜ…なぜ…。

 3枚目もネコチャン。:cat:
 neko2.jpg
 昨年の実装の判別結果はこちら。
 平均色:#8b8084 代表色:#55aa55 判定結果:green
 今年の判別結果はこちら。
 平均色:#8b8084 代表色:#999999 判定結果:gray
 今年の実装だと、代表色がまるっきり変わりました。
 判定結果も灰色!↑の1枚目のネコの画像と同じ感じですね。
 平均色と合わせてみると、灰色判定が正しい気がします。

 4枚目は水族館の亀!。:turtle:
 kame.jpg
 昨年の実装の判別結果はこちら。
 平均色:#7a8390 代表色:#55aaaa 判定結果:green
 今年の判別結果はこちら。
 平均色:#7a8390 代表色:#669999 判定結果:green
 代表色は違いますが、どちらも緑ですね。ただ、代表色の数を増やした結果、微妙に色が変わりました。
 今年の実装の代表色の緑は、画面奥の水の色に近い気がします。

 5枚目は水族館の大水槽。:fish:
 suisou.jpg
 昨年の実装の判別結果はこちら。
 平均色:#426c50 代表色:#555555 判定結果:gray
 今年の判別結果はこちら。
 平均色:#426c50 代表色:#336666 判定結果:green
 こっちは明確に変わりましたね。昨年は灰色判定だったものが今年は緑に。
 代表色がダークグリーンっぽい色になっているので、緑判定は妥当ですかね。

6. さいごに

 色判定部分の実装はあまり変更せず、ファイル読み込み部分と、色判別に使用するカラーコードを増やすマイナーチェンジをしましたが、今年はGeminiを使用して割とサクサクと改修できたと思います。ただ、AIの使用で楽になったはなったのですが、やはり色々と問題はあるなぁ、という感じです。
 まず1つ目。当然ですが、AIで生成したコードがそのまま動くわけではないという点ですね。やはり、動作確認をしつつ、リファクタリングについては人力でやる必要が出てきてしまいますね。現時点でAIの生成したコードは、あくまで参考という形にするのが無難かなと思いました。
 2つ目は、色分類の部分で、AIの判断はぶれているように感じました。具体的には、Web216色を11色に分類する作業でGeminiを使用したのですが、以下の問題点が出ました。
 

  • 曖昧な色(いわゆる青と緑のどちらともとれるような色、中間色)が複数の色分類に含まれている
  • 分類された結果を合計しても216色にならない
  • どうしても、あいまいな色をその他という項目にまとめたがる

 上記3点を解消するのに苦労しました……。:grimacing:
 どうにか頑張ってGeminiの結果だけを使おうとレスバしたのですが、結局、過不足分のカラーコードをGeminiに出力してもらい、1つずつ確認しながら手動で分類することに。
 もともと、あいまいな色については、それこそ人によって分類される色が変わるので、AIには難しいのかもしれませんね。
 
 今回、Geminiで行った色分類の結果を載せておきます。ソースコードにはそのまま使用していますが、ちょっと分類おかしくない?という色があります。

black

#000000

gray

#333333
#666666
#999999
#CCCCCC

white

#FFFFFF

red

#FF0000
#FF0033
#FF3300
#FF3333
#CC0000
#CC0033
#CC3300
#CC3333
#990000
#993300
#660000
#663300
#FF6600
#FF6633
#CC6600
#CC6633
#996600
#666600
#FF0066
#CC0066
#990066
#660066
#FF3366
#CC3366
#660033
#990033
#993366
#CC6666
#FF6666

orange

#FF9900
#FF9933
#FF9966
#FFCC00
#FFCC33
#FFCC66
#FFFF00
#FFFF33
#FFFF66
#CC9900
#CC9933
#CC9966
#CCCC00
#CCCC33
#CCCC66
#999900
#999933
#FFCC99

yellow

#FFFF99
#FFFFCC

green

#00FF00
#33FF00
#66FF00
#99FF00
#CCFF00
#00FF33
#33FF33
#66FF33
#99FF33
#CCFF33
#00FF66
#33FF66
#66FF66
#99FF66
#CCFF66
#00FF99
#33FF99
#66FF99
#99FF99
#CCFF99
#00FFCC
#33FFCC
#66FFCC
#99FFCC
#CCFFCC
#00FFFF
#33FFFF
#66FFFF
#99FFFF
#CCFFFF
#00CCFF
#33CCFF
#66CCFF
#99CCFF
#CCCCFF
#00CC00
#33CC00
#66CC00
#99CC00
#00CC33
#33CC33
#66CC33
#99CC33
#00CC66
#33CC66
#66CC66
#99CC66
#00CC99
#33CC99
#66CC99
#99CC99
#00CCCC
#33CCCC
#66CCCC
#99CCCC
#009900
#339900
#669900
#009933
#339933
#669933
#009966
#339966
#669966
#009999
#339999
#669999
#006600
#336600
#006633
#336633
#006666
#336666
#999966
#003300
#003333
#CCCC99

blue

#0000FF
#3300FF
#6600FF
#0033FF
#3333FF
#6633FF
#0066FF
#3366FF
#6666FF
#9966FF
#0099FF
#3399FF
#6699FF
#9999FF
#0000CC
#3300CC
#6600CC
#0033CC
#3333CC
#6633CC
#0066CC
#3366CC
#6666CC
#0099CC
#3399CC
#6699CC
#9999CC
#000099
#330099
#660099
#990099
#CC0099
#003399
#333399
#666699
#000033
#000066
#003366
#006699
#333366
#336699

purple

#FF00FF
#FF33FF
#FF66FF
#FF99FF
#FFCCFF
#CC00FF
#CC33FF
#CC66FF
#CC99FF
#9900FF
#9933FF
#FF33CC
#FF66CC
#CC00CC
#CC33CC
#CC99CC
#9900CC
#9933CC
#9966CC
#993399
#663399
#996699
#330066
#663366

pink

#FF0099
#FF3399
#FF6699
#FF9999
#CC0099
#CC3399
#CC6699
#CC9999
#FFCCCC
#FF99CC
#FF00CC
#CC66CC

brown

#993333
#996633
#663333
#666633
#333300
#330000
#330033
#996666

 改めて見ると、明らかに緑色っぽいのに赤に分類されていたり、ピンクや紫なのに青に分類されていたりと、手動での調整必須ですね。

 今回、複数ファイルをまとめて読み込めるようにしたことで、もともとこの機能を使用してやりたかったことに少しずつ近づいて来ました。
 来年は形にできるよう、色々手を加えていければと思います。

 CYBIRD Advent Calendar 2025 16日目は@cy-naullさんの「JMeterで直前のサンプラーが成功したか確認する方法」です。
 お楽しみに!!:blush:

0
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
0
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?