Как галлюцинации ИИ мешают работе
Клиент поставил задачу — выводить в карточку товара картинки товара в модном формате webp.
Я поискал решения и нашел вот такой код:
// Предположим, у нас есть двоичные данные файла WebP ДвоичныеДанныеWebP = Новый ДвоичныеДанные("C:\temp\image.webp"); // Создаем объект Картинка на основании этих данных МояКартинка = Новый Картинка(ДвоичныеДанныеWebP); // Сохраняем картинку в формате JPEG // Платформа сама выполнит перекодирование "на лету" МояКартинка.Записать("C:\temp\image.jpg", ФорматКартинки.JPEG);
Дополнительно было сказано:
Рассмотрим самый простой и современный метод. Если вы используете платформу версии 8.3.22 или более новую, у нас есть отличная новость: фирма «1С» добавила нативную поддержку WebP. Теперь платформа умеет и читать, и записывать этот формат без использования сторонних программ.
На основании этой статьи я взялся за задачу, решил, что конвертация будет довольно простой, встроенными средствами, без использования конвертеров или внешних компонент.
Увы, на практике все оказалось не так.
У картинки нет метода Записать с такими параметрами. Я попробовал другой код:
ДвоичныеДанныеФайла = Новый ДвоичныеДанные("D:\Users\fixin\Downloads\1.webp"); МояКартинка = Новый Картинка(ДвоичныеДанныеФайла); МояКартинка.Преобразовать(ФорматКартинки.PNG); МояКартинка.Записать("D:\Users\fixin\Downloads\1.jpeg");
На что получил ошибку:
Ошибка при вызове метода контекста (Преобразовать)
по причине:
Неизвестный формат картинки
Совершенно случайно я нашел объект ОбрабатываемаяКартинка и решил попробовать преобразовать через нее:
ДвоичныеДанныеФайла = Новый ДвоичныеДанные("D:\Users\fixin\Downloads\1.webp"); МояКартинка = Новый Картинка(ДвоичныеДанныеФайла); ОбрабатываемаяКартинка = Новый ОбрабатываемаяКартинка(МояКартинка); ОбрабатываемаяКартинка.ПреобразоватьВОттенкиСерого(); НоваяКартинка = ОбрабатываемаяКартинка.ПолучитьКартинку(); НоваяКартинка.Записать("D:\Users\fixin\Downloads\1.jpeg");
Но увы и тут получил ошибку:
Ошибка при вызове конструктора (ОбрабатываемаяКартинка)
[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]
по причине:
Ошибка преобразования картинки
по причине:
Ошибка при выполнении операции ImageMagick: 1CV8C.exe: NoDecodeDelegateForThisImageFormat `WEBP' @ error/constitute.c/ReadImage/746
Вот непонятно — зачем 1С вообще подгружает картинку из webp, если ничего сделать с ней не может, даже отобразить. Думаю, тут причина в проприетарности формата, для отображения картинок в этом формате нужно заплатить разработчику формата.
ИИ подсказал, что можно конвертировать через dwebp:
Самый надежный способ в 1С — использовать внешнюю утилиту (например, официальную консольную утилиту
dwebpот Google) или COM-объект (например, ImageMagick). Рассмотрим вариант сdwebp.exe, так как он не требует сложной установки.
Я кстати нашел еще генерацию картинки через двумерную матрицу RGB. Но с webp это не сработает, опять же цитирую ответ ИИ:
Напрямую прочитать
WEBPвстроенными средствами 1С (черезДвоичныеДанныеиЧтениеДанных) без конвертации во что-то другое не получится.Причина проста:
WEBP— это сложнейший формат сжатия (основанный на видеокодеке VP8), где данные пикселей зашифрованы алгоритмами предиктивного кодирования и преобразования Хаффмана. Чтобы превратить его в матрицу, внутри 1С придется написать полноценный декодер изображений на языке 1С, что нецелесообразно и будет работать критически медленно.
Вот так ИИ чуть не обманул меня, хорошо, что я не писал под Fresh, где нельзя использовать командную строку для конвертации.
