Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как используя nmpjs конвертировать JPG base64 в webp base64 или же прямо в файл? (https://javascript.ru/forum/events/84689-kak-ispolzuya-nmpjs-konvertirovat-jpg-base64-v-webp-base64-ili-zhe-pryamo-v-fajjl.html)

mik888em 16.11.2022 23:25

Как используя nmpjs конвертировать JPG base64 в webp base64 или же прямо в файл?
 
Конвертирую картинку JPG формата в WEBP формат.
Поставил npmjs модуль https://www.npmjs.com/package/webp-converter на node 18.
Поставил в перем [[PYT]] - путь к jpg файлу вот такой:
C:\Users\username\Downloads\777\1c.jpg


Но в переменную [[ITOG]] не сохраняется ничего (она пустая).


И использую из офиц доков такой пример для:
Convert base64 image to webpbase64 image

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");
    [[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")


Но в переменную [[ITOG]] не сохраняется ничего (она пустая)

Aetae 17.11.2022 03:19

Ставлю палку колбасы, что не пустая, а там лежит Promise.
Советую изучить https://learn.javascript.ru/async.
Без понимания асинхронности в javascript ты никуда не уедешь и будешь спотыкаться на каждом шагу.

Примерно так оно должно выглядеть в плоском виде:
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() {
  // тут весь код, вне main ничего кроме других деклараций функций ничего быть не должно

  const path = [[PYT]];
  
  const result = await getWebpBase64(path);
  console.log(result);
  
  [[ITOG]] = result;
}

main();


Вообще либа явно написана каким-то залётным хреном, мало что понимающем в js, так что может и вообще не работать. Но проверять мне лень.)

Alexandroppolus 17.11.2022 10:33

Цитата:

Сообщение от Aetae
const data = await fs.readFile(path);
const buf = Buffer.from(data);
const dataBase64 = Buffer.from(buf).toString('base64');

зачем ты дополнительно два раза делаешь Buffer из Buffer? data уже готовый буфер

mik888em 17.11.2022 12:34

Цитата:

Сообщение от Aetae (Сообщение 548955)
Ставлю палку колбасы, что не пустая, а там лежит Promise.
Советую изучить https://learn.javascript.ru/async.
Без понимания асинхронности в javascript ты никуда не уедешь и будешь спотыкаться на каждом шагу.

Примерно так оно должно выглядеть в плоском виде:
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() {
  // тут весь код, вне main ничего кроме других деклараций функций ничего быть не должно

  const path = [[PYT]];
  
  const result = await getWebpBase64(path);
  console.log(result);
  
  [[ITOG]] = result;
}

main();


Вообще либа явно написана каким-то залётным хреном, мало что понимающем в js, так что может и вообще не работать. Но проверять мне лень.)

Запустил но [[ITOG]] - пустой(
Попробовал экранировать слеши в пути. В перем [[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();

mik888em 17.11.2022 12:44

Убрал
const dataBase64 = Buffer.from(buf).toString('base64');

но [[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);
  // 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() {
  // тут весь код, вне main ничего кроме других деклараций функций ничего быть не должно

  const path = [[PYT]];
  
  const result = await getWebpBase64(path);
  console.log(result);
  
  [[ITOG]] = result;
}

main();

Aetae 17.11.2022 13:50

Alexandroppolus, я просто переписал код неглядя.)

mik888em, экранирование работает не так, что ты за домики понарисовал.
'C:\\Users\\username\\Downloads\\777\\1c.jpg'

Цитата:

но [[ITOG]] -пустой.
Похрен что он пустой, если тебе всю консоль ошибками засрать должно было при таком коде. Может и другие ошибки которые тебе либа пишет ты не читал?

mik888em 17.11.2022 22:47

спасибо , получилось)


Часовой пояс GMT +3, время: 04:46.