У меня есть шестнадцатеричные данные, 0xFFD8FFE000104A46494600...
, они есть в строке, в xaml моего приложения WPF у меня есть <Image/>
, где должно оказаться это закодированное изображение. У меня есть несколько вопросов по этому поводу.
Самая большая проблема, я просто не могу найти способ ее декодировать, я тоже не понимаю, как это работает, я просто знаю, что у меня есть строка и мне нужно в итоге получить изображение, я не знаю, нужно ли это изображение сохранить где-нибудь, или что я могу напрямую добавить изображение к <Image/>
в реальном скрипте... Мне нужна помощь с этим, мне просто нужен метод, в котором я могу передать строку с ним, и он вернет изображение, которое я могу использовать.
Как лучше всего это сделать? Например, если это изображение профиля на разных страницах, следует ли мне каким-то образом сохранить его или сохранить где-нибудь строку и постоянно ее декодировать или?..
Примечание. Шестнадцатеричные данные верны, я использовал этот веб-сайт с такими входными и выходными данными: нажмите, чтобы увидеть мой тест
По сути, вы можете преобразовать шестнадцатеричную строку в массив байтов, а затем создать 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 Вы удалили «0x» из начала строки?
Проверьте, действительна ли ваша шестнадцатеричная строка (если количество символов четное, удаляются только 1–9 и A–F, 0x).
Я этого не сделал, теперь я это сделал, и это выдает мне еще одну ошибку, вот она: System.ArgumentOutOfRangeException: 'Индекс и длина должны относиться к местоположению в строке. Arg_ParamName_Name'
@Jorne Похоже, у вас есть лишняя шестнадцатеричная цифра или конечный пробел, или вам ее не хватает. Длина hexData
должна быть четным числом.
Он отлично работает на веб-сайте, на который я дал ссылку в вопросе, и ввод должен быть правильным, а не сделанным мной (это задание большого проекта, и мы можем использовать любые ресурсы, которые захотим, для решения этой проблемы, потому что мы не учились этому .)
Проверьте это stackoverflow.com/questions/25933590/… Попробуйте вручную проверить шестнадцатеричную строку. Проверьте, содержит ли он только цифры 0–9 и A–F, никаких пробелов или других символов. Длина должна быть четной.
он возвращает истину
Я только что проверил, длина четная.
Можете ли вы поделиться своей шестнадцатеричной строкой? Вставьте его куда-нибудь или запишите в файл и загрузите. ctxt.io
как я могу поделиться файлом? Не вижу возможности сюда вставить, тоже долго вставлять куда-то сюда, 60к+ символов
Попробуйте wetransfer.
Я не могу использовать сокращатели URL-адресов, вероятно, из соображений безопасности, здесь я разделил ссылку, добавив пробел: we .tl/t-taS80tEq1G
примечание: я уже удалил 0x
Длина строки, которую вы мне прислали, не четная, а 65533.
Омг, я допустил такую глупую ошибку при подсчете, извините за это. Но хм, почему это работает на сайте раньше, а не здесь? И есть ли способ заставить это работать? Потому что это есть в задании.
Давайте продолжим обсуждение в чате.
Вы можете преобразовать шестнадцатеричную строку в массив байтов, затем создать BitmapImage из массива байтов, а затем установить это растровое изображение в качестве источника для элемента управления изображением.