将 [System.Drawing.Bitmap] 转换为 [File.IFileAbstraction]
Convert a [System.Drawing.Bitmap] to [File.IFileAbstraction]
任务
在 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
?
我在网上找到的最接近的帮助是here and here。但它适用于 .NET 4.5,我无法将其转换为 PowerShell 语法
Here is the documentation of taglib-sharp's picture object 如果有帮助。
简单的版本就是调用 c# code in powershell (as described here)
$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 中测试
任务
在 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
?
我在网上找到的最接近的帮助是here and here。但它适用于 .NET 4.5,我无法将其转换为 PowerShell 语法
Here is the documentation of taglib-sharp's picture object 如果有帮助。
简单的版本就是调用 c# code in powershell (as described here)
$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 中测试