Как мне извлечь varbinary (max) поле Microsoft SQL в изображение, используя golang? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть поле varbinary (max) в Microsoft SQL Server, которое содержит изображение.

При запуске «ВЫБРАТЬ ИЗОБРАЖЕНИЕ ИЗ ТАБЛИЦЫ» я получаю результат, который выглядит как «0x07FD30 ....»

При использовании go для извлечения данных я получаю ту же шестнадцатеричную строку, которая сохраняется как байт []:

type Person struct {
    PersonID string
    Image    []byte
} 

Я подключаюсь к базе данных и выполняю:

rows.Scan(&person.PersonID, &person.Image)

А затем выведите результат в шестнадцатеричном виде, он такой же:

fmt.Printf("%#x", p.Image)

Результат:

0x07fd30...

Мой вопрос: как мне превратить это обратно в изображение?

Я пытался записать необработанные байты в файл:

ioutil.WriteFile("./tempfile.png", p.Image, 0644)

Я пытался использовать библиотеку изображений для ее декодирования, что просто приводит к ошибкам с неопознанным видом:

image.Decode(bytes.NewReader(p.Image))

А также пытался png.Encode тоже.

Любые мысли или указатели в правильном направлении очень приветствуются.

Большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 23 июля 2019

Даррен был прав насчет того, что первые 7 байтов всегда добавляются в файлы изображений с помощью AX, то есть 07FD3097F90000.К сожалению, похоже, что AX также добавляет другую информацию в конец двоичного файла.Я не выяснил точную схему этого, но обычно, если загруженное изображение - .png, AX просто добавляет FF в конец, иначе это вносит тонны изменений в файл.

В вашемВ этом случае, если вы просто заинтересованы в одном конкретном изображении, хранящемся на сервере SQL, взгляните на двоичный файл и посмотрите, заканчивается ли он FF.Если да, удалите лишние байты, а затем преобразуйте его в base64, чтобы отобразить его.

var data="0xFFD8FFE000104A464946....d";

var bytes = [];

for(var i=2; i< data.length-1; i+=2){
    bytes.push(parseInt(data.substr(i, 2), 16));
}
//str contains the base64 form of the image
var str = btoa(String.fromCharCode.apply(String, bytes));
0 голосов
/ 21 сентября 2018

Запись необработанных байтов в файл с ioutil.WriteFile("./tempfile.png", p.Image, 0644) кажется правильным процессом.Однако по какой-то причине Microsoft Dynamics AX 2012, кажется, добавляет дополнительные 7 байтов в начало файла при сохранении его в базе данных с их классом BinData.Итак, использование ioutil.WriteFile(s, p.Image[7:], 0644) работает.Я хотел бы понять, что это за 7 байтов и для чего они нужны, но это на другой день.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...