Конвертация картинки в WEBP формат.
-
Конвертирую картинку JPG формата в WEBP формат, модулем "Обработка изображений" ,а конкретно кубиком "Изменить формат изображения".
Прикол в том что картинка получается с сильным розовым оттенком, особенно это заметно на светлых картинках (например изображение заснеженных гор).
Вопрос: Модуль "Изменить формат изображения" умеет правильно конвертить в формат WEBP ?
-
-
@gurkin4 said in Конвертация картинки в WEBP формат.:
webp-converter
Поставил npmjs модуль в бас на node 18.
Записал jpg картинку в формате base64 в переменную [[FILE_CONTENT]]
И использую и офиц доков такой пример для:
Convert base64 image to webpbase64 imageconst webp=require('webp-converter'); const path=[[FILE_CONTENT]] function get_webpbase64(path) { fs.readFile(path, function (error, data) { if (error) { throw error; } else { let buf = Buffer.from(data); let dataBase64 = Buffer.from(buf).toString('base64'); // base64str of image // base64str image type jpg,png ... //option: options and quality,it should be given between 0 to 100 let result = webp.str2webpstr(dataBase64,"jpg","-q 80"); result.then(function(result) { // you access the value from the promise here console.log(result) }); } }); } // use the default temp path for conversion get_webpbase64("./nodejs_logo.jpg") // use the custom temp path for conversion get_webpbase64("./nodejs_logo.jpg","/home/user/Desktop/webp/temp")
Но данный код выдает ошибку:
[441746869] [21:48:30] Поток №1 : ReferenceError: fs is not defined
-
@Nikolas said in Конвертация картинки в WEBP формат.:
Но данный код выдает ошибку:
Она означает, что переменная fs не объявлена. В вашем примере кода nodejs выполняет чтение файла по пути, который вы указываете.
const path
это (внезапно) путь до файла
-
@Fox точно, спасибо ,не задал вар fs.
Но тут другая проблема, в переменную [[ITOG]] не сохраняется ничего (она пустая):const webp=require('webp-converter'); const fs=require('fs'); const path=[[FILE_CONTENT]]; function get_webpbase64(path) { fs.readFile(path, function (error, data) { if (error) { throw error; } else { let buf = Buffer.from(data); let dataBase64 = Buffer.from(buf).toString('base64'); // base64str of image // base64str image type jpg,png ... //option: options and quality,it should be given between 0 to 100 let result = webp.str2webpstr(dataBase64,"jpg","-q 80"); [[ITOG]]=result; result.then(function(result) { // you access the value from the promise here console.log(result) }); } }); } // use the default temp path for conversion get_webpbase64("./nodejs_logo.jpg") // use the custom temp path for conversion get_webpbase64("./nodejs_logo.jpg","/home/user/Desktop/webp/temp")
-
@Nikolas said in Конвертация картинки в WEBP формат.:
Но тут другая проблема, в переменную [[ITOG]] не сохраняется ничего (она пустая):
Переменная [[FILE_CONTENT]] создаётся автоматически в действии "Читать Файл", следовательно в ней у вас содержание файла, а не путь до него.
-
@Fox поставил
const path=[[PYT]];
где в перем [[PYT]] присвоено это: C:\Users\username\Downloads\777\1c.jpg
И так же [[ITOG]] пустая.
-
@Nikolas said in Конвертация картинки в WEBP формат.:
@Fox поставил
const path=[[PYT]];
где в перем [[PYT]] присвоено это: C:\Users\username\Downloads\777\1c.jpg
И так же [[ITOG]] пустая.В вашей переменной промис, поставьте её после then.
-
This post is deleted!
-
@Fox said in Конвертация картинки в WEBP формат.:
then
Также в [[ITOG]] пустоconst webp=require('webp-converter'); const fs=require('fs'); const path=[[PYT]]; function get_webpbase64(path) { fs.readFile(path, function (error, data) { if (error) { throw error; } else { let buf = Buffer.from(data); let dataBase64 = Buffer.from(buf).toString('base64'); // base64str of image // base64str image type jpg,png ... //option: options and quality,it should be given between 0 to 100 let result = webp.str2webpstr(dataBase64,"jpg","-q 80"); result.then(function(result) { [[ITOG]]=result; // you access the value from the promise here console.log(result) }); } }); } // use the default temp path for conversion get_webpbase64("./nodejs_logo.jpg") // use the custom temp path for conversion get_webpbase64("./nodejs_logo.jpg","/home/user/Desktop/webp/temp")
-
@Fox может там нужно еще подключить в бас npm-модуль для работы с файловой системой ?
-
@Nikolas said in Конвертация картинки в WEBP формат.:
@Fox просто весь код не стал сюда скидывать, естессно что в коде поменял, но эффекта нет, [[ITOG]] -пустой :
А вы читали вообще свой код то? У вас идёт объявление функции
function get_webpbase64(path) {...
, а в конце кода вызов этой функции с атрибутамиget_webpbase64("./nodejs_logo.jpg")
-
Объявили в начале function get_webpbase64(path)
Поэтому удалил внизу. Но результ пустой.const webp=require('webp-converter'); const fs=require('fs'); const path=[[PYT]]; function get_webpbase64(path) { fs.readFile(path, function (error, data) { if (error) { throw error; } else { let buf = Buffer.from(data); let dataBase64 = Buffer.from(buf).toString('base64'); // base64str of image // base64str image type jpg,png ... //option: options and quality,it should be given between 0 to 100 let result = webp.str2webpstr(dataBase64,"jpg","-q 80"); result.then(function(result) { [[ITOG]]=result; // you access the value from the promise here console.log(result) }); } }); }
-
@Nikolas said in Конвертация картинки в WEBP формат.:
Объявили в начале function get_webpbase64(path)
Поэтому удалил внизу. Но результ пустой.Вы вообще не понимаете что делаете?
-
@Fox
Пробовал экранировать слеши в пути. В перем [[PYT]] поставил:C:/\Users/\username/\Downloads/\777/\1c.jpg
Но [[ITOG]] - пустой
Код
const webp = require('webp-converter'); const fs = require('fs').promises; async function getWebpBase64(path) { const data = await fs.readFile(path); const buf = Buffer.from(data); const dataBase64 = Buffer.from(buf).toString('base64'); // base64str of image // base64str image type jpg,png ... //option: options and quality,it should be given between 0 to 100 return webp.str2webpstr(dataBase64, 'jpg', '-q 80'); } async function main() { const path = [[PYT]]; const result = await getWebpBase64(path); console.log(result); [[ITOG]] = result; } main();
-
-
@UserTrue said in Конвертация картинки в WEBP формат.:
await main();
Спасибо. Заработало, но есть проблема! получаю виде строки base64 в [[ITOG]] , и когда сохраняю этот base64 в файл, то файл webp имеет размер 19 KB, а ориг файл jpg весит 20 кб....то есть сжатие 5%, хотя по идее файл webp должен иметь сжатие оч сильное (в ~3 -4 раза) с тем же качеством картинки.
Менял параметр -q 80 на 30 и менее. Но это влияет только на качество картинки, но не на "сжатие веса".
Код:
const webp = require('webp-converter'); const fs = require('fs').promises; async function getWebpBase64(path) { const data = await fs.readFile(path); const buf = Buffer.from(data); const dataBase64 = Buffer.from(buf).toString('base64'); // base64str of image // base64str image type jpg,png ... //option: options and quality,it should be given between 0 to 100 return webp.str2webpstr(dataBase64, 'jpg', '-q 80'); } async function main() { const path = [[PYT]]; const result = await getWebpBase64(path); console.log(result); [[ITOG]] = result; } await main();
-
@Nikolas по поводу этого уже обращайтесь к документации библиотеки, к
NodeJS
иBAS
это уже имеет крайне косвенное отношение, хотя если кто занимался этим здесь - может быть и подскажут, но проще документацию посмотреть.
-
Поставил 65% качество (см в коде), тогда размер картинки уменьшается примерно в 2,5 раза.
Почему такое качество, т к это оптимальное по тестам (cм график, тесты на графике делал не я). Но мои небольшие тесты подтвердили что 65% - это оптимально:
Вобщем вот готовое решение, может кому-то будет полезно:Заранее создаем папку temp руками или basовскими экшенами вот тут:
C:\Users\Administrator\Desktop\BrowserAutomationStudio\apps\ 25.3.8 \e\ рандом имя папки может быть \distr\app\node_modules\webp-converter\ tempВ Басе включаем Node.js на версии 18.0 работает , проверил!
Добавляем npmjs модуль https://www.npmjs.com/package/webp-converter в Node.js .В переменную [[PYT]] указываем путь к jpg файлу на диске.
После отработки скрипта в экшене Node.js мы в переменной [[ITOG]] получаем текст (тип строка) который является webp-картинкой но представлен в base64 форме, далее этот код уже можно другими экшенами сохранить в виде картинки.
Код для экшена Node.js
const webp = require('webp-converter'); const fs = require('fs').promises; async function getWebpBase64(path) { const data = await fs.readFile(path); const buf = Buffer.from(data); const dataBase64 = Buffer.from(buf).toString('base64'); // base64str of image // base64str image type jpg,png ... //option: options and quality,it should be given between 0 to 100 return webp.str2webpstr(dataBase64, 'jpg', '-q 65'); } async function main() { const path = [[PYT]]; const result = await getWebpBase64(path); console.log(result); [[ITOG]] = result; } await main();
-
@Nikolas said in Конвертация картинки в WEBP формат.:
Код для экшена Node.js
const webp = require('webp-converter');
const fs = require('fs').promises;
async function getWebpBase64(path) {
const data = await fs.readFile(path);
const buf = Buffer.from(data);
const dataBase64 = Buffer.from(buf).toString('base64');
// base64str of image
// base64str image type jpg,png ...
//option: options and quality,it should be given between 0 to 100
return webp.str2webpstr(dataBase64, 'jpg', '-q 65');
}
async function main() {
const path = [[PYT]];
const result = await getWebpBase64(path);
console.log(result);
[[ITOG]] = result;
}
await main();var webp = require('webp-converter'); [[RESULT]] = await webp.str2webpstr([[FILE_CONTENT]], 'jpg', '-q 65');