Как сохранить растровое изображение, созданное с помощью System.Drawing.Image, обратно в base64

Я пытаюсь поместить строку изображения 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)

Ваше почтовое сообщение должно быть в формате MIME, а изображение — в одном из вложений MIME. См. Learn.microsoft.com/en-us/previous-versions/office/developer‌​/…

jdweng 25.06.2024 14:40

@jdweng Поскольку мой вопрос не включал никакого кода для отправки чего-либо по электронной почте, я не уверен, какое отношение имеет ваш комментарий. Однако независимо от того, соответствует ли это стандартам или нет, проверено, что неизмененное изображение работает в теге <img src = "data:image/png;base64,"">, отлично.

user66001 25.06.2024 16:27

Вы сказали «включить встроенное сообщение в электронное письмо в формате HTML». В электронной почте в формате HTML, когда вы объединяете текст и изображения, это MIME.

jdweng 25.06.2024 17:04

@jdweng Без этого все работало нормально, так что, надеюсь, это будет полезно другим.

user66001 26.06.2024 18:02

Вы можете отправить все тело электронного письма в виде текста Base64, но тогда вам придется распаковать все тело. MIME предоставляет больше возможностей для обработки электронного письма по разделам, а не по одному объекту.

jdweng 26.06.2024 22:26

@jdweng Посмотрим, будет ли в следующем проекте сделан один MIME, а не разные разделы, или нет.

user66001 27.06.2024 23:09

MIME — это формат HTML. Вы просто отправляете ТЕКСТ (строка Base 64).

jdweng 27.06.2024 23:21

@jdweng — Нет, остальная часть письма — в формате HTML.

user66001 29.06.2024 00:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас есть несколько опечаток в последнем разделе вашего кода:

  1. New-Object IO.MemoryStream(), при использовании команды New-Object вам не нужны круглые скобки для вызова определенного конструктора, аргументы ctor разделены пробелами, и в этом случае круглые скобки вызывают одну из проблем. Рекомендуемый способ создания нового объекта с использованием нового синтаксиса:

    $ImageBytesMemoryStream = [System.IO.MemoryStream]::new()
    
  2. Второй аргумент, передаваемый .Save: System.Drawing.Imaging.ImageFormat.ToString() — синтаксическая ошибка. Аргумент ожидает значение свойства ImageFormat, см. ссылку, чтобы проверить, какие из них доступны. Я использую Png для примера.

    $NewBitmap.Save($ImageBytesMemoryStream, [System.Drawing.Imaging.ImageFormat]::Png)
    
  3. Вы пытаетесь преобразовать объект потока памяти в 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()

Другие вопросы по теме