2

仕事

PowerShell で、 taglip-sharpライブラリを使用して ID3V2 タグとして画像を追加したいと考えています。
通常、次のようにします。

# Load taglib-sharb library
[Reflection.Assembly]::LoadFrom( (Resolve-Path "..\Common\taglib-sharp.dll"))

# Load MP3 file
$media = [TagLib.File]::Create("C:\MusicFile.mp3")

# Load picture
$pic = [taglib.picture]::createfrompath("C:\MyAlbumArt.jpg")

# Add picture to MP3
$media.Tag.Pictures = $pic

# Save Mp3 
$media.Save() 

一般的な問題

上記は、画像がローカルのどこかにあるファイルである場合にのみ機能します。しかし、私は[System.Drawing.Bitmap]それをロードするファイルパスを持たないオブジェクトとして画像を持っていますcreatefrompath

あなたが言う前に ディスクに書き込んでください : 私の最終的なスクリプトは多くの画像と mp3 ファイルを処理するので、それらを保存するのは避けたいと思います。そして、何百枚もの写真を書いて削除したくありません。

具体的な質問

taglib にはCreateFromFile(File.IFileAbstraction )、画像をロードするために呼び出される別のメソッドもあります。しかし、どうすれば a[System.Drawing.Bitmap]を aに変換できIFileAbstractionますか?

ネットで見つけた最も近いヘルプはherehereでした。しかし、それは.NET 4.5用であり、これをPowerShell構文に変換することは決してできません

役立つ場合は、taglib-sharp の画像オブジェクトのドキュメントを次に示します。

4

1 に答える 1

2

簡単なバージョンは、powershell でc# コードを呼び出すだけです (ここで説明されているように) 。

  $refs = @(
"c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Drawing.dll",
"d:\taglib-sharp.dll"
)

$Source = @"

 namespace YourNamespace
    {
        public class Helper
        {
            public static TagLib.IPicture[] GetPictureFromBitmap(System.Drawing.Bitmap img)
            {
                return

                    new TagLib.IPicture[]
                    {
                        new TagLib.Picture(
                            new TagLib.ByteVector(
                                (byte[]) new System.Drawing.ImageConverter().ConvertTo(img, typeof (byte[]))))
                    };

            }
        }
    }
"@ 

Add-Type -Path $refs
Add-Type -ReferencedAssemblies $refs -TypeDefinition $Source -Language CSharp  

# Load MP3 file
$media = [TagLib.File]::Create("C:\MusicFile.mp3")

# Load picture into System.Drawing.Image
[Bitmap]$pic =[System.Drawing.Image]::FromFile("C:\MyAlbumArt.jpg")

# Add picture to MP3
$media.Tag.Pictures = [YourNamespace.Helper]::GetPictureFromBitmap($pic)

# Save Mp3 
$media.Save() 

完全な powershell バージョン:

function GetPictureFromBitmap([System.Drawing.Bitmap]$bitmap)
{
    $converter = New-Object -TypeName System.Drawing.ImageConverter
    $byte_vec = New-Object -TypeName TagLib.ByteVector -ArgumentList $converter.ConvertTo($bitmap, [byte[]])
    $picture = New-Object -TypeName TagLib.Picture -ArgumentList $byte_vec
    $picture_list = New-Object TagLib.IPicture[] 1
    $picture_list[0] = $picture
    return $picture_list
}


$refs = @(
"c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Drawing.dll",
"d:\taglib-sharp.dll"
)

Add-Type -Path $refs

# Load MP3 file
$media = [TagLib.File]::Create("C:\MusicFile.mp3")

# Load picture into System.Drawing.Image
[Bitmap]$pic = [System.Drawing.Image]::FromFile("C:\MyAlbumArt.jpg")

# Add picture to MP3
$media.Tag.Pictures = GetPictureFromBitmap($pic)

# Save Mp3 
$media.Save() 

PowerShell v3 でテスト済み

于 2015-08-19T16:04:23.870 に答える