Я пытаюсь поместить строку изображения base64 в объект system.drawing.image (выполнено), а затем вернуться в base64 (не работает), чтобы включить встроенную строку в электронное письмо в формате HTML, но у меня возникли трудности.
Приведенное ниже (закомментированные строки) взято со страницы веб-сайта о том, как сделать то, что не работает, но первая ошибка связана с отсутствием аргументов при создании объекта MemoryStream, поэтому мне интересно, не является ли это совершенно неправильным способом действий. этот. У меня возникли проблемы с поиском других веб-сайтов, на которых подробно описано, как это сделать, особенно в Powershell, а не в собственных объектах .NET.
Примечание. Остальная часть кода предназначена для редактирования изображения по назначению, вместо этого оно отображается путем вывода в файл ($NewBitmap.save(<filename>)
).
Что мне не хватает?
$ImageBytes = [Convert]::FromBase64String($AccountNameInputExamplePic)
$ImageBytesMemoryStream = New-Object IO.MemoryStream($ImageBytes, 0, $ImageBytes.Length)
$OldBitmap = [System.Drawing.Image]::FromStream($ImageBytesMemoryStream, $true)
#new-object System.Drawing.Bitmap $Source
$NewBitmap = new-object System.Drawing.Bitmap $OldBitmap.width,$OldBitmap.height
$g=[System.Drawing.Graphics]::FromImage($NewBitmap)
$g.clear([System.Drawing.Color]::White)
$g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
$g.DrawImage($OldBitmap, 0, 0, $OldBitmap.width,$OldBitmap.height)
$font = new-object System.Drawing.Font "Segoe UI",13
$brushFg = [System.Drawing.Brushes]::Yellow
$g.DrawString($($UserAndPasswordExpiry.sAMAccountName),$font,$brushFg,190,463)
$g.Dispose()
#$ImageBytesMemoryStream = New-Object IO.MemoryStream()
#$NewBitmap.save($ImageBytesMemoryStream, System.Drawing.Imaging.ImageFormat.ToString())
#$ImageBase64 = [Convert]::ToBase64String($ImageBytesMemoryStream)
@jdweng Поскольку мой вопрос не включал никакого кода для отправки чего-либо по электронной почте, я не уверен, какое отношение имеет ваш комментарий. Однако независимо от того, соответствует ли это стандартам или нет, проверено, что неизмененное изображение работает в теге <img src = "data:image/png;base64,"">, отлично.
Вы сказали «включить встроенное сообщение в электронное письмо в формате HTML». В электронной почте в формате HTML, когда вы объединяете текст и изображения, это MIME.
@jdweng Без этого все работало нормально, так что, надеюсь, это будет полезно другим.
Вы можете отправить все тело электронного письма в виде текста Base64, но тогда вам придется распаковать все тело. MIME предоставляет больше возможностей для обработки электронного письма по разделам, а не по одному объекту.
@jdweng Посмотрим, будет ли в следующем проекте сделан один MIME, а не разные разделы, или нет.
MIME — это формат HTML. Вы просто отправляете ТЕКСТ (строка Base 64).
@jdweng — Нет, остальная часть письма — в формате HTML.
У вас есть несколько опечаток в последнем разделе вашего кода:
New-Object IO.MemoryStream()
, при использовании команды New-Object
вам не нужны круглые скобки для вызова определенного конструктора, аргументы ctor разделены пробелами, и в этом случае круглые скобки вызывают одну из проблем. Рекомендуемый способ создания нового объекта с использованием нового синтаксиса:
$ImageBytesMemoryStream = [System.IO.MemoryStream]::new()
Второй аргумент, передаваемый .Save
: System.Drawing.Imaging.ImageFormat.ToString()
— синтаксическая ошибка. Аргумент ожидает значение свойства ImageFormat, см. ссылку, чтобы проверить, какие из них доступны. Я использую Png
для примера.
$NewBitmap.Save($ImageBytesMemoryStream, [System.Drawing.Imaging.ImageFormat]::Png)
Вы пытаетесь преобразовать объект потока памяти в base64 вместо его байтов, используйте .ToArray()
, чтобы получить хранящиеся в нем байты изображения:
[Convert]::ToBase64String($ImageBytesMemoryStream.ToArray())
Подводя итоги, вот как должен выглядеть последний раздел вашего кода:
$ImageBytesMemoryStream = [System.IO.MemoryStream]::new()
$NewBitmap.save($ImageBytesMemoryStream, [System.Drawing.Imaging.ImageFormat]::Png)
$ImageBase64 = [Convert]::ToBase64String($ImageBytesMemoryStream.ToArray())
Предполагая, что вы хотите вернуть скорректированное изображение в $NewBitmap
в строку Base64, вы можете сделать следующее:
# select the image format to use (here PNG as example)
$imageFormat = [System.Drawing.Imaging.ImageFormat]::Png
# create a MemoryStream object
$memoryStream = [System.IO.MemoryStream]::new()
# use the Bitmap's Save() method and save the data to the MemoryStream
$NewBitmap.Save($memoryStream, $imageFormat)
# use the MemoryStream's ToArray() method to get the bytes to convert into a Base64 string
$ImageBase64 = [Convert]::ToBase64String($memoryStream.ToArray())
# clean up memory when no longer needed
$memoryStream.Dispose()
$NewBitmap.Dispose()
Ваше почтовое сообщение должно быть в формате MIME, а изображение — в одном из вложений MIME. См. Learn.microsoft.com/en-us/previous-versions/office/developer/…