将[System.Drawing.Bitmap]转换为[File.IFileAbstraction]

时间:2015-08-12 22:20:07

标签: powershell system.drawing taglib-sharp

任务

在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 )的方法来加载图片。但是,如何将[System.Drawing.Bitmap]转换为IFileAbstraction

我在网上找到的最近帮助是herehere。但它适用于.NET 4.5,我无法将其转换为PowerShell语法

Here is the documentation of taglib-sharp's picture object如果有帮助的话。

1 个答案:

答案 0 :(得分:2)

简易版只需在powershell中调用c# code(如here所述)

"*\n"

完整的PowerShell版本:

  $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 v3中测试