ねぶたの画像とそのねぶたの解説文の書かれた画像をくっつけた画像を作成していくPGM

<h3>ねぶたの画像とそのねぶたの解説文の書かれた画像をくっつけた画像を作成していくPGM</h3>

ねぶたのアーカイブのサイトからねぶたの写真の画像ダウンロードと解説文をダウンロードして、
解説文の画像を作ってから、ねぶたの写真画像とそのねぶたの解説文の画像をくっつけた画像を
作成していくPGMをpowershellとpythonで作成しました.

<hr>
<h3>作成手順<h3>

以下の手順で画像リストを作成しました。

1-a.ねぶたのサイトからサクラエディタによる手動スクレイピングでねぶたの紹介ページのURLの一覧
をファイルに出力する(URL:https://www.nebuta.jp/)

1-b.ねぶたのサイトからサクラエディタによる手動スクレイピングでねぶたのテーマの一覧
をファイルに出力する(URL:https://www.nebuta.jp/)

2. 1-aで取得したURLリストをpowershellスクレイピングで写真の画像と解説文をそれぞれダウンロードする

3. 2で取得したねぶたの解説文と1-bで取得したねぶたのテーマの、文字列をpowershell-PGMで連結する

4. 3で作成したねぶたの解説文をpowershellPGMで解説文画像に変換する

5.2でダウンロードしたねぶたの写真画像で4で作成した解説文画像をpython-PGMで連結する

<hr>
<h3>各手順で使用したPGM</h3>

<hr>
2. 1-aで取得したURLリストをpowershellスクレイピングで写真の画像と解説文をそれぞれダウンロードする


DownloadNebutaImgList.ps1

```powershell

function CutKaisetubun{
    param($htmlLines)

$sFlg = $false
$eFlg = $false

$StartStr = "<!-- ▲大型ねぶた＆子どもねぶた・担ぎねぶたカテゴリの場合に表示▲ -->"
$EndStr = "<!-- ▼大型ねぶた＆子どもねぶた・担ぎねぶたカテゴリの場合に表示▼ -->"

$KaisetuStr1 = "";

for($i=0; $i -lt $htmlLines.Length; $i++){
    $line1 = $htmlLines[$i]

    if($line1.Contains($StartStr)){
        $KaisetuStr1 += $line1

        $i++
        for($j=$i; $j -lt $htmlLines.Length; $j++){
            $line1 = $htmlLines[$j]

            if(-not $line1.Contains($EndStr)){
                $KaisetuStr1 += $line1
            }

            if($line1.Contains($EndStr)){
                $i = $j+1
                break
            }
        }

    break    
    }

}
$KaisetuStr1 = $KaisetuStr1.Replace($EndStr, "");


$KaisetuStr1 = $KaisetuStr1.replace("（","###-");
$KaisetuStr1 = $KaisetuStr1.replace("）","-###");
$KaisetuStr1 = $KaisetuStr1.replace("(","###-");
$KaisetuStr1 = $KaisetuStr1.replace(")","-###");

#ひらがなルビ削除用正規表現
$KaisetuStr1 = $KaisetuStr1 -replace '###-[ゐあいうえおぁぃぅぇぉかきくけこヵがぎぐげごさしすせそざじずぜぞたちつてとっだぢづでどなにぬねのはひふへほばびぶべぼぱぴぷぺぽまみむめもやゆよゃゅょらりるれろわをん]+-###', ''

$KaisetuStr1 = $KaisetuStr1.replace("--", "")
$KaisetuStr1 = $KaisetuStr1.replace("###", "")
$KaisetuStr1 = $KaisetuStr1.replace("<br />", "")


#<rt>...</rt>の部分削除
$str1 = $KaisetuStr1.ToCharArray()
$str3 = "";
for($i=0; $i -lt ($str1.Length-4); $i++){
    
    #<rt>
    $str2 = $str1[$i] + $str1[$i+1] + $str1[$i+2] + $str1[$i+3] 
    if($str2 -eq "<rt>"){
        #echo $str2
        $j = $i+4
        $ch1 = $str1[$j]
        while($ch1 -ne "<"){
            $ch1 = $str1[$j]
            $j++
        }
        $str4 = $str1[$j-1] + $str1[$j] + $str1[$j+1] + $str1[$j+2] + $str1[$j+3]
        #echo $str4 
        $i = $j+4
    }
    $str3 += $str1[$i]
}



#echo "---aaa---"
#echo $KaisetuStr1

#echo "---bbb---"

$s = $str3
$s2 = $s -replace '&[^;]+;',''
$s2 = $s -replace '<rt>[^<]+</rt>',''
$s2 = $s2 -replace ‘<[^>]+>’,''
$s2 = $s2 -replace '&[^;]+;',''
$s2 = $s2 -replace '\t', ''
$s2 = $s2.replace(" ","");
$s2 = $s2.Replace("　","");
$s2 = $s2.Replace("`r`n", "");
$s2 = $s2.Replace("<", "");
$s2 = $s2.Replace(">", "");
$s2 = $s2.Replace("/", "")
$s2 = $s2.Replace("--", "")


#半角と全角で微妙に違ってくる
$s2 = $s2.Replace("､",",");
$s2 = $s2.Replace("、",",");
$s2 = $s2.Replace("。",".");
$s2 = $s2.Replace("｡",".");


#echo $s2

return $s2

}

$URLList = Get-Content C:\ねぶたの紹介ページのURL一覧を保存したファイルのパス\imgURLList1.txt -Encoding UTF8
$imgURLList = @()
$KaisetuList = @()

echo $URLList.Length

$SearchStr = "<!-- ▼山車写真▼ -->"
for($i=0; $i -lt $URLList.Length; $i++){
    $URL1 = $URLList[$i]

    Invoke-WebRequest -Uri $URL1 -OutFile "C:htmlファイル一時保存先パス\source1.html"
    $html = Get-Content "C:htmlファイル一時保存先パス\source1.html"  -Encoding UTF8

    $kaisetuStr = CutKaisetubun $html
    $KaisetuList += $kaisetuStr
    #echo $kaisetuStr
    #echo "---"

    for($j=0; $j -lt $html.Length; $j++){
        $line1 = $html[$j]
        if($line1.Contains($SearchStr)){
            $imgURL1 = $html[$j+1]
            $imgURLList += $imgURL1

        }
    }
}

$str1 = "<p class=""center""><img src="""
$str2 = """ /></p><p><br/><p>"
for($k=0; $k -lt $imgURLList.Length; $k++){
    $line2 = $imgURLList[$k].Replace($str1, "");
    $line2 = $line2.Replace($str2, "");
    $line2 = "https://www.nebuta.jp" + $line2

    echo $line2

    #写真をダウンロード
    $newFileName = "C:\写真画像保存先パス"+[string]($k+1)
    $newFileName += ".jpg"
    Invoke-WebRequest -Uri $line2 -OutFile $newFileName
    
    #解説文を保存
    $newFileName2 = "C:\解説文のテキストデータ保存先パス\"+[string]($k+1)
    $newFileName2 += ".txt"
    Write-Output $KaisetuList[$k] | Out-File -FilePath  $newFileName2;
}



```

<hr>

3. 2で取得したねぶたの解説文と1-bで取得したねぶたのテーマの、文字列をpowershell-PGMで連結する

ConcatTitle.ps1

```powershell
$TitleList = Get-Content C:ねぶたのテーマ一覧を保存したテキストファイルのパス\titles.txt -Encoding UTF8

$kaisetubunCount = $TitleList.Length
for($i=0; $i -lt $kaisetubunCount; $i++){
    $path1 = "C:解説文のテキストファイルが保存してあるパス"
    $path1 = $path1 + [string]($i+1) + ".txt"
    $kaisetuStr = Get-Content $path1 -Encoding UTF8

    $kaisetuStr2 = $TitleList[$i] + "`r`n" + $kaisetuStr
    #echo $kaisetuStr2

    $newFileName2 = "C:タイトル連結後の解説文テキストの保存先パス"+[string]($i+1)
    $newFileName2 += ".txt"
    Write-Output $kaisetuStr2 | Out-File -FilePath  $newFileName2;
 }

```

<hr>

4. 3で作成したねぶたの解説文をpowershellPGMで解説文画像に変換する

PaintSousa2.ps

```powershell

#SendKeysを使うため、System.Windows.Forms名前空間読込

# .NET Frameworkの宣言
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

# Windows APIの宣言
$signature=@'
[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
$SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru

$i= 0
$kaisetubunCount = 467

for(; $i -lt $kaisetubunCount; $i++){
    $path1 = "C:解説文が保存されているフォルダのパス"
    $path1 = $path1 + [string]($i+1) + ".txt"
    $kaisetuStr = Get-Content $path1 -Encoding UTF8


    Start-Process mspaint
    sleep -s 3


    # 変数設定
    #---A---
    $x = 450
    $y = 120


    # マウスカーソル移動
    [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)

    Start-sleep -s 1
    # 左クリック
    $SendMouseClick::mouse_event(0x0002, 0, 0, 0, 0);
    Start-sleep -s 1
    $SendMouseClick::mouse_event(0x0004, 0, 0, 0, 0);

    # 変数設定
    #---A---
    $x = 625
    $y = 350


    # マウスカーソル移動
    [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)

    Start-sleep -s 1
    # 左クリック
    $SendMouseClick::mouse_event(0x0002, 0, 0, 0, 0);
    Start-sleep -s 1
    $SendMouseClick::mouse_event(0x0004, 0, 0, 0, 0);

    Start-sleep -s 1
    # 左クリック
    $SendMouseClick::mouse_event(0x0002, 0, 0, 0, 0);
    Start-sleep -s 1

    # 変数設定
    #---A---
    $x = 1300
    $y = 840

    # マウスカーソル移動
    [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)
    Start-sleep -s 1

    $SendMouseClick::mouse_event(0x0004, 0, 0, 0, 0);

    [System.Windows.Forms.SendKeys]::SendWait($kaisetuStr)
    [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")


    # 変数設定
    #---A---
    $x = 800
    $y = 330
    # マウスカーソル移動
    [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)
    Start-sleep -s 1
    # 左クリック
    $SendMouseClick::mouse_event(0x0002, 0, 0, 0, 0);
    Start-sleep -s 1
    $SendMouseClick::mouse_event(0x0004, 0, 0, 0, 0);



    [System.Windows.Forms.SendKeys]::SendWait("{F12}")
    sleep -s 3
    
    $fileName = [string]($i+1) + ".jpg"
    [System.Windows.Forms.SendKeys]::SendWait($fileName)
    sleep -s 3
    [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")

    sleep -s 3
    Stop-Process -Name mspaint
}


```

<hr>

5.2でダウンロードしたねぶたの写真画像で4で作成した解説文画像をpython-PGMで連結する

concatImg3.py

```python
import cv2
import time
outputFilePath = "C:\\出力先ファイルパス\\"
imgPhotoPath = "C:\\ねぶたの写真画像が保存されているフォルダのパス\\"
imgKaisetuPath = "C:\\ねぶたの解説画像が保存されているファイルのパス\\"

fileCount = 468;
for fileIdx in range(1, fileCount, 1):
    fileName = str(fileIdx) + ".jpg"
    
    path1 = imgPhotoPath + fileName;
    path2 = imgKaisetuPath + fileName;
    path3 = outputFilePath + fileName;

    imgPhoto = cv2.imread(path1)
    imgKaisetu = cv2.imread(path2)
    
    #Resize D Size
    img_ds=cv2.resize(imgPhoto,(500,530)) # ( X, Y)
    img_ds2=cv2.resize(imgKaisetu, (700, 530))

    img_new = cv2.hconcat([img_ds, img_ds2])

    #cv2.imshow('test2', img_new)
    cv2.imwrite(path3, img_new);



cv2.waitKey(0) 
cv2.destroyAllWindows()

time.sleep(3)


```

<hr>

出力画像例

![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/75baad39-886b-d3b1-2e72-8f21582c5496.jpeg)

<hr>
参考にしたサイト、元素材を利用したサイト

<a href="https://www.nebuta.jp/">青森ねぶた祭　オフィシャルサイト</a><br>

<a href="https://note.nkmk.me/python-opencv-hconcat-vconcat-np-tile/">Python, OpenCVで画像を縦・横に連結 (hconcat, vconcat, np.tile) | note.nkmk.me</a><br>
<a href="https://qiita.com/JarvisSan22/items/e335c9c814948e06d1b3">OpenCV-python:リサイズする方法（cv2.resize) #Python - Qiita</a><br>
<a href="https://buralog.jp/powershell-remove-html-tag-from-variables-or-file/">【PowerShell】HTMLタグを除去する方法 - buralog</a><br>
<a href="https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_regular_expressions?view=powershell-7.4">正規表現について - PowerShell | Microsoft Learn</a><br>
<a href="https://note.com/mahalo_/n/n3cb5ed1fd91e">PowerShell　WebページのHTMLソースをダウンロードする｜🐹マリモのごはん🐍</a><br>
<a href="http://kh3467.blog66.fc2.com/blog-entry-273.html">サクラエディタ 指定の文字列以外を削除する Snowfall~雪はどれだけ積もったか。</a><br>
<a href="https://qiita.com/nkojima/items/4489f33cfc1fb3cbaece">【PowerShell】自作関数を作る #PowerShell - Qiita</a><br>
<a href="https://earthtraveljournal.com/archives/1726">PowerShellのファイル出力はこれだけ覚えればOK【上書き・追記】 | 世界を一人で旅するブログ</a><br>
<a href="https://qiita.com/nogizakapython/items/232db0e34de14720e359">文字を1文字ずつ配列に格納する(Powershell) #PowerShell - Qiita</a><br>