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?

createIcon.ps1

Last updated at Posted at 2025-07-06

1. スクリプト概要

スクリプト名: createIcon.ps1
一文字表記のビットマップファイルを一括で作成します。

2. 処理と目的

処理の流れ
 1. 出力対象文字を引数から取得します
 2. 1で取得できなかった場合は英数字・ひらがな・カタカナ・漢字のすべてを対象とします
 3. 出力対象文字と出力先フォルダを画面に出力して一時停止します
 4. 対象文字の種類(数字・ひらがな等)毎に背景色と文字色の設定をします
 5. 設定された背景色・文字色でビットマップファイルの出力をします
(ビットマップの幅はpxWidth、高さはpxHeight、フォントはfontFamilyでコード内に直接記載しています)
(フォントサイズはビットマップ高さに入るサイズで最大のものが選ばれます)

目的
 別のソフトでスクリプト一覧を見た際にスクリプト名の頭文字がアイコンになっていると可視性があがるかもしれないと思ったので、その分類のために一括でアイコンを作成できるようにした。

3. 動作環境と要件

PowerShellのバージョン
7.0以上

OS
Windows10

必要なモジュール
特になし

必要な権限
特になし

その他の設定
特になし

4. 使用方法

基本的な実行方法
スクリプトコードを拡張子ps1で保存してPowershellで実行してください。
ファイルを保存する際は、文字コードをUTF8 BOM付にしてください。

パラメータ
なし

使用例

  1. コマンドラインでpwsh createIcon.ps1を実行
  2. 検索対象フォルダを聞いてくるのでフォルダのフルパスを入力

5. スクリプトコード


using namespace System.Drawing

#Add-Type -AssemblyName Microsoft.VisualBasic
using namespace Microsoft.VisualBasic

$charList = @()

if($_){
  $charList = [Strings]::StrConv($_.ToUpper(), [VbStrConv]::Wide).ToCharArray()
}

$numberChars   = '0123456789'.ToCharArray()
$alphabetChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.ToCharArray()
$hiraganaChars = (0x3042..0x3093) | %{[char]$_} #ひらがな
$katakanaChars = (0x30A1..0x30F6) | %{[char]$_} #カタカナ
$kanjiChars    = (0x4E00..0x9FCF) | %{[char]$_} #漢字

if(($charList|Measure).Count -eq 0){
  $charList += $numberChars
  $charList += $alphabetChars
  $charList += $hiraganaChars
  $charList += $katakanaChars
  $charList += $kanjiChars
}
#$charList = $hiraganaChars + $katakanaChars

$outDir = 'D:\DATA\icon'
echo "-------------------------------------------------------"
echo "対象文字:$(($charList -join ''))"
echo "出力フォルダ:$($outDir)"
echo "-------------------------------------------------------"
pause

$charParameterList = @()
foreach($charText in $charList){
  $newparam = @{}
  $newparam['char'] = $charText
  
  #数字(背景黒、文字白)
  if($charText -in $numberChars){
    $newparam['backColor'] = [System.Drawing.Color]::FromArgb(0, 0, 0)
    $newparam['foreColor'] = [System.Drawing.Color]::FromArgb(255, 255, 255)
  }
  #アルファベット(背景白、文字黒)
  elseif($charText -in $alphabetChars){
    $newparam['backColor'] = [System.Drawing.Color]::FromArgb(255, 255, 255)
    $newparam['foreColor'] = [System.Drawing.Color]::FromArgb(128, 128, 128)
  }
  #ひらがな
  elseif($charText -in $hiraganaChars){
    $newparam['backColor'] = [System.Drawing.Color]::FromArgb(0, 0, 255)
    $newparam['foreColor'] = [System.Drawing.Color]::FromArgb(255, 255, 0)
  }
  #カタカナ
  elseif($charText -in $katakanaChars){
    $newparam['backColor'] = [System.Drawing.Color]::FromArgb(0, 255, 255)
    $newparam['foreColor'] = [System.Drawing.Color]::FromArgb(255, 0, 0)
  }
  #漢字
  elseif($charText -in $kanjiChars){
    $newparam['backColor'] = [System.Drawing.Color]::FromArgb(255, 255, 0)
    $newparam['foreColor'] = [System.Drawing.Color]::FromArgb(0, 0, 255)
  }
  #その他
  else{
    $newparam['backColor'] = [System.Drawing.Color]::FromArgb(128, 128, 128)
    $newparam['foreColor'] = [System.Drawing.Color]::FromArgb(255, 255, 255)
  }
  $charParameterList += $newparam
}

foreach($charParam in $charParameterList){
  
  $pxWidth = 32
  $pxHeight = 32
  
  $iconChar = $charParam['char']
  
  if($charParam['backColor'] -ne $null){
    $backColor = $charParam['backColor']
  } else {
    $backColor = [System.Drawing.Color]::FromArgb((Get-Random -Minimum 0 -Maximum 255), (Get-Random -Minimum 0 -Maximum 255), (Get-Random -Minimum 0 -Maximum 255))
  }
  
  if($charParam['foreColor'] -ne $null){
    $textColor = $charParam['foreColor']
  } else {
    $textColor = [System.Drawing.Color]::FromArgb(255-$backColor.R, 255-$backColor.G, 255-$backColor.B)
  }
  
  Write-Host "iconChar=${iconChar} pxWidth=${pxWidth} pxHeight=${pxHeight} backColor=${backColor} textColor=${textColor}"  -foregroundColor DarkGray

  $bmp = [Bitmap]::new( $pxWidth, $pxHeight, [Imaging.PixelFormat]::Format32bppArgb)
  $g = [Graphics]::FromImage($bmp)

  #背景を塗りつぶし
  $backBrush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb(0, 0, 0, 0)) 
  $g.FillRectangle($backBrush, 0, 0, $pxWidth, $pxHeight)

  #背景の●を描画
  $sBrush = New-Object System.Drawing.SolidBrush($backColor) 
  $g.FillEllipse($sBrush, 0,0,$pxWidth-1,$pxHeight-1)
  
  $g.TextRenderingHint = "AntiAlias"

  #フォント
  for($fontSize = 128; $fontSize -gt 0; $fontSize--){
    #$fontSize = 24
    $fontFamily = "Arial"
    $font = [System.Drawing.Font]::new($fontFamily, $fontSize)

    $sf = [System.Drawing.StringFormat]::new()
    $stringSize = $g.MeasureString($iconChar, $font, $pxWidth+99, $sf)
    #echo "fontSize=${fontSize} stringSize=${stringSize}"
    if($stringSize.Width -le  $pxWidth -and $stringSize.Height -le  $pxHeight){
      Write-Host "fontSize=${fontSize} stringSize=${stringSize}" -foregroundColor DarkGray
      break
    }
  }
  

  $textBrush = New-Object System.Drawing.SolidBrush($textColor)
  $textWidth = [Math]::Round(($pxWidth - $stringSize.Width) / 2) + 0
  $textHeight = [Math]::Round(($pxHeight - $stringSize.Height) / 2) + 1
  Write-Host "textWidth=${textWidth} textHeight=${textHeight}" -foregroundColor DarkGray
  $g.DrawString($iconChar, $font, $textBrush, $textWidth, $textHeight, $sf)

  
  # グラフィックオブジェクトを開放
  $g.Dispose()
  $font.Dispose()

  # ビットマップを保存
  $OutFile = Join-Path $outDir "${iconChar}.ico"
  Write-Host $OutFile -ForegroundColor Cyan
  $bmp.Save($OutFile, [System.Drawing.Imaging.ImageFormat]::Bmp)
  $bmp.Dispose()
}
pause

6. 注意事項と既知の問題

制約事項
・作成対象にひらがな・カタカナ・漢字を含めて処理すると多数のファイルを作成する事になります。出力先にはご注意意ください
・出力先フォルダ・文字フォント・ビットマップ幅高さがコード内に固定で書かれているため環境によっては書き換えないと動かない可能性があります。

既知のバグ
もしバグを発見された場合は、コメントでご報告ください。

トラブルシューティング
・ps1ファイルのエンコーディングには注意してください。

7. 免責事項

保証はありません。使用は自己責任で行ってください。

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?