Преобразование шестнадцатеричного значения в изображение на C#

У меня есть шестнадцатеричные данные, 0xFFD8FFE000104A46494600..., они есть в строке, в xaml моего приложения WPF у меня есть <Image/>, где должно оказаться это закодированное изображение. У меня есть несколько вопросов по этому поводу.

  1. Самая большая проблема, я просто не могу найти способ ее декодировать, я тоже не понимаю, как это работает, я просто знаю, что у меня есть строка и мне нужно в итоге получить изображение, я не знаю, нужно ли это изображение сохранить где-нибудь, или что я могу напрямую добавить изображение к <Image/> в реальном скрипте... Мне нужна помощь с этим, мне просто нужен метод, в котором я могу передать строку с ним, и он вернет изображение, которое я могу использовать.

  2. Как лучше всего это сделать? Например, если это изображение профиля на разных страницах, следует ли мне каким-то образом сохранить его или сохранить где-нибудь строку и постоянно ее декодировать или?..

Примечание. Шестнадцатеричные данные верны, я использовал этот веб-сайт с такими входными и выходными данными: нажмите, чтобы увидеть мой тест

Вы можете преобразовать шестнадцатеричную строку в массив байтов, затем создать BitmapImage из массива байтов, а затем установить это растровое изображение в качестве источника для элемента управления изображением.

Milos Stojanovic 29.05.2024 11:23
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

По сути, вы можете преобразовать шестнадцатеричную строку в массив байтов, а затем создать BitmapImage и установить его BitmapImage в качестве источника для вашего Image элемента управления.

Преобразование шестнадцатеричной строки в массив байтов можно выполнить следующим образом (источник):

public static byte[] StringToByteArray(String hex)
{
  int NumberChars = hex.Length;
  byte[] bytes = new byte[NumberChars / 2];
  for (int i = 0; i < NumberChars; i += 2)
    bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
  return bytes;
}

После этого вам нужно из байтового массива составить BitmapImage. Вы можете сделать это так (источник):

public BitmapImage ToImage(byte[] array)
{
    using (var ms = new System.IO.MemoryStream(array))
    {
        var image = new BitmapImage();
        image.BeginInit();
        image.CacheOption = BitmapCacheOption.OnLoad; // here
        image.StreamSource = ms;
        image.EndInit();
        return image;
    }
}

Затем вам нужно установить BitmapImage в качестве источника для вашего Image элемента управления. Вы можете сделать это следующим образом:

string hexData = "FFD8FFE000104A46494600...";
byte[] imageData = StringToByteArray(hexData);
BitmapImage bitmapImage = ToImag(imageData);

// you have to have <Image x:Name = "imageControl" /> in your XAML
imageControl.Source = bitmapImage;

Надеюсь, это сработает. Сейчас не могу реально попробовать. Способ хранения и загрузки изображений — это другая тема.

Обновлено:
Подводя итог обсуждению комментариев и чата... Чтобы это сработало, проверьте, действительна ли шестнадцатеричная строка (если количество символов четное, если оно содержит только 0-9 и A-F (поэтому нет пробелов, разделителей и т. д.) и что 0x удален). Небольшой обходной путь, если длина нечетное число, попробуйте добавить 0 в конце шестнадцатеричной строки.

Спасибо за ответ, однако это не работает, при выполнении получаю ошибку в строке: bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16);, ошибка гласит: System.FormatException: «Не удалось найти распознаваемые цифры».

Jorne 29.05.2024 12:03

@Jorne Вы удалили «0x» из начала строки?

Andrew Morton 29.05.2024 12:07

Проверьте, действительна ли ваша шестнадцатеричная строка (если количество символов четное, удаляются только 1–9 и A–F, 0x).

Milos Stojanovic 29.05.2024 12:08

Я этого не сделал, теперь я это сделал, и это выдает мне еще одну ошибку, вот она: System.ArgumentOutOfRangeException: 'Индекс и длина должны относиться к местоположению в строке. Arg_ParamName_Name'

Jorne 29.05.2024 12:09

@Jorne Похоже, у вас есть лишняя шестнадцатеричная цифра или конечный пробел, или вам ее не хватает. Длина hexData должна быть четным числом.

ProgrammingLlama 29.05.2024 12:10

Он отлично работает на веб-сайте, на который я дал ссылку в вопросе, и ввод должен быть правильным, а не сделанным мной (это задание большого проекта, и мы можем использовать любые ресурсы, которые захотим, для решения этой проблемы, потому что мы не учились этому .)

Jorne 29.05.2024 12:12

Проверьте это stackoverflow.com/questions/25933590/… Попробуйте вручную проверить шестнадцатеричную строку. Проверьте, содержит ли он только цифры 0–9 и A–F, никаких пробелов или других символов. Длина должна быть четной.

Milos Stojanovic 29.05.2024 12:17

он возвращает истину

Jorne 29.05.2024 12:21

Я только что проверил, длина четная.

Jorne 29.05.2024 12:27

Можете ли вы поделиться своей шестнадцатеричной строкой? Вставьте его куда-нибудь или запишите в файл и загрузите. ctxt.io

Milos Stojanovic 29.05.2024 12:32

как я могу поделиться файлом? Не вижу возможности сюда вставить, тоже долго вставлять куда-то сюда, 60к+ символов

Jorne 29.05.2024 12:36

Попробуйте wetransfer.

Milos Stojanovic 29.05.2024 12:37

Я не могу использовать сокращатели URL-адресов, вероятно, из соображений безопасности, здесь я разделил ссылку, добавив пробел: we .tl/t-taS80tEq1G

Jorne 29.05.2024 12:41

примечание: я уже удалил 0x

Jorne 29.05.2024 12:43

Длина строки, которую вы мне прислали, не четная, а 65533.

Milos Stojanovic 29.05.2024 12:44

Омг, я допустил такую ​​глупую ошибку при подсчете, извините за это. Но хм, почему это работает на сайте раньше, а не здесь? И есть ли способ заставить это работать? Потому что это есть в задании.

Jorne 29.05.2024 12:46

Давайте продолжим обсуждение в чате.

Milos Stojanovic 29.05.2024 12:47

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