WPFなアプリケーションで 画像をクリップボード経由で保存する関数をつくりました
(何かドキュメントを勘違いして読んでた)
高度な関数にするほどでもなく使いどころが限定されすぎる
作った理由はExcel写真帳
.ps1
function Export-ClipboardToJpg{
[OutputType([Void])]
param($filepath)
#クリップボードから画像を取り出してエンコード・保存
$pic = [System.Windows.Clipboard]::GetImage();
$enc = New-Object System.Windows.Media.Imaging.JpegBitmapEncoder;
$enc.Frames.Add([System.Windows.Media.Imaging.BitmapFrame]::Create($pic));
$fs = New-Object system.IO.FileStream -ArgumentList "$filepath",'Create','Write'
$enc.Save($fs);
$fs.Close();
return
}
System.Windows.Media.Imaging.JpegBitmapEncoderを変更すればPNG,BMP,TIFFにも変更可
####高度な関数
よくわからないが需要があるようなので高度な関数にやっつけた
jpg,png,tif,bmpに同時出力可(Excel写真帳弄ってたらjpgとtifでくれといわれたりするような奴は俺以外にもいるはず。いると言え。 orz)
.ps1
function Export-ClipboardToImage{
[CmdletBinding()]
[OutputType([Void])]
param(
[parameter(
mandatory = $false,
helpmessage = '出力先のフォルダを指定。指定がない場合ユーザのマイドキュメントへ出力'
)]
[string]$destination = [Environment]::GetFolderPath('MyDocuments'),
[parameter(
mandatory = $true,
helpmessage = 'ファイル名。拡張子不要'
)]
[string]$basename = '',
[parameter(
mandatory = $false,
helpmessage = '.jpgで出力。スイッチがつかない場合デフォルトでjpg'
)]
[switch]$jpg,
[parameter(
mandatory = $false,
helpmessage = '.pngで出力'
)]
[switch]$png,
[parameter(
mandatory = $false,
helpmessage = '.tifで出力'
)]
[switch]$tif,
[parameter(
mandatory = $false,
helpmessage = '.bmpで出力'
)]
[switch]$bmp
)
begin{
#出力先フォルダがあるかチェック
if(Test-Path $destination){
$path = $(Get-Item $($destination+'\')).fullname + $basename;
}
else{
throw "出力先:$destination が存在しません";
}
#出力形式
if( -not $($jpg -or $png -or $bmp -or $tif)){
$jpg = $true;
};
}
process{
#クリップボードから画像を取り出してエンコード・保存
if(-not [System.Windows.Clipboard]::ContainsImage()){
throw 'クリップボードに画像がない';
}
$pic = [System.Windows.Clipboard]::GetImage();
#出力
if($jpg){
$filepath = $path + '.jpg'
$enc = New-Object System.Windows.Media.Imaging.JpegBitmapEncoder;
$enc.Frames.Add([System.Windows.Media.Imaging.BitmapFrame]::Create($pic));
$fs = New-Object system.IO.FileStream -ArgumentList "$filepath",'Create','Write';
$enc.Save($fs);
$fs.Close();
}
if($png){
$filepath = $path + '.png'
$enc = New-Object System.Windows.Media.Imaging.PngBitmapEncoder;
$enc.Frames.Add([System.Windows.Media.Imaging.BitmapFrame]::Create($pic));
$fs = New-Object system.IO.FileStream -ArgumentList "$filepath",'Create','Write';
$enc.Save($fs);
$fs.Close();
}
if($tif){
$filepath = $path + '.tif'
$enc = New-Object System.Windows.Media.Imaging.TiffBitmapEncoder;
$enc.Frames.Add([System.Windows.Media.Imaging.BitmapFrame]::Create($pic));
$fs = New-Object system.IO.FileStream -ArgumentList "$filepath",'Create','Write';
$enc.Save($fs);
$fs.Close();
}
if($bmp){
$filepath = $path + '.bmp'
$enc = New-Object System.Windows.Media.Imaging.BmpBitmapEncoder;
$enc.Frames.Add([System.Windows.Media.Imaging.BitmapFrame]::Create($pic));
$fs = New-Object system.IO.FileStream -ArgumentList "$filepath",'Create','Write';
$enc.Save($fs);
$fs.Close();
}
}
end{
return
}
}
#####以下こんな風に使う例
.ps1
#example
$path = 'X:\xls\'
$OutPath = 'X:\jpg\'
try{
#Excelオブジェクトの作成
$xls_app = New-Object -ComObject Excel.Application
#Excelを画面に表示する
$xls_app.Visible = $false
$xls_app.ScreenUpdating = $false
#Excelの警告をオフ
$xls_app.DisplayAlerts = $false
Get-ChildItem -Path $path -File -Filter '*.xls'|%{
$xls_file = $_.fullname
$basename = $_.basename
$xls_books = $xls_app.Workbooks.Open("$xls_file")
$cnt_exlws = $xls_books.Worksheets.Count
#シートへ接続
$xls_sheet = $xls_books.Worksheets.Item(1)
$xls_sheet.Activate()
$ws_name = $xls_sheet.Name
#写真を取得
$ary_shapes = @()
$cnt_shapes = $xls_sheet.Shapes.Count
if($cnt_shapes -eq 0){break}
$i = 1
do{
$ary_shapes += $xls_sheet.Shapes.Item($i);
$i++
}until($i -gt $cnt_shapes);
#leftの位置が小さい方が近景
$near = $ary_shapes|
Where-Object -Property AutoShapeType -EQ 1|
Sort-Object -Property left |
Select-Object -First 1;
$near.ScaleHeight(1,$true,1);
$near.ScaleWidth(1,$true,1);
$near.Copy();
Export-ClipboardToJpg -filepath $($OutPath+$basename+'_'+'near.jpg');
#leftの位置が大きい方が遠景
$far = $ary_shapes|
Where-Object -Property AutoShapeType -EQ 1|
Sort-Object -Property left |
Select-Object -Last 1;
$far.ScaleHeight(1,$true,1);
$far.ScaleWidth(1,$true,1);
$far.Copy();
Export-ClipboardToJpg -filepath $($OutPath+$basename+'_'+'far.jpg');
#ブックのクローズ
$xls_books.Close($false) ;
}
}finally{
#region end
#Excelの警告をon
#Excelを画面に表示する
$xls_app.Visible = $true
$xls_app.ScreenUpdating = $true
$xls_app.DisplayAlerts = $true
#Excelのクローズ
#comオブジェクト操作なのでPSから指示しないとexcelのプロセスが残る
#quit()の後、操作に使った変数にnullを入れて開放する、戻り値なし(out-null)
$xls_app.Quit()
foreach($obj in $xls_sheet,$xls_books,$xls_app){
[System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($obj)|Out-Null
}
#ガベージコレクタを動作させる
[GC]::Collect();
Write-Host("終了")
#region
}