Я новичок в RxJS и пробую эту (казалось бы) простую задачу, но я просто не могу понять это.Изменение размера изображений с помощью RxJS и узла
Я хочу:
1. Прочитайте изображение из файла
2. Преобразовать этот образ на несколько более мелких изображений
3. Сохраните все изображения в файл
Я преобразованный fs.readFile и фс .writeFile для наблюдаемых.
const readFile$ = Rx.Observable.bindNodeCallback(fs.readFile);
const writeFile$ = Rx.Observable.bindNodeCallback(fs.writeFile);
Я изготовил трубопровод изображений.
var pictureSizes = [
{width: 100, size: 'thumbnail', suffix: '_t'},
{width: 300, size: 'small', suffix: '_s'},
{width: 600, size: 'medium', suffix: '_m'},
{width: 1000, size: 'large', suffix: '_l'}
];
И я сделал resizeImage $ функцию с использованием графики магии
function resizeImage$(picture, data) {
return Rx.Observable.create(observer => {
gm(data)
.resize(picture.width)
.toBuffer('jpg', function(err, buffer) {
if (err) {
console.log(err);
observer.error(err);
} else {
observer.next(buffer);
observer.complete();
}
});
})
}
Я думаю (надеюсь) выше нормально. Я не могу понять, как связать своих операторов.
readFile$('./largeimage.jpg')
.mergeMap(data => pictureSizes.map(picture => resizeImage$(picture, data)))
.flatMap(picture => writeFile$('./testImages/resized.jpg', picture))
.subscribe(
(x) => console.log('Next', x),
(e) => console.log('Error', e),
(c) => console.log('Complete',c)
)
Это выше поврежденные данные в файл jpeg. (И перезаписывает этот файл, потому что я не могу понять, как получить pictureSizes.suffix во имя выводимого файла.
Все, что помогает! Спасибо.
UPDATE
Я получил его на работу , но я знаю, что эта причудливая множественная подписка - это ужасный анти-шаблон. Основная подписка завершается до изменения размера изображения. У меня такое чувство, что это проблема с горячей/холодной, но я понятия не имею, как это исправить. код ..
const pictureSizes = [
{width: 100, size: 'thumbnail', suffix: '_t'},
{width: 300, size: 'small', suffix: '_s'},
{width: 600, size: 'medium', suffix: '_m'},
{width: 1000, size: 'large', suffix: '_l'}
];
const image = 'truck.jpg';
function resizeImage$(binary, pictureSize) {
return new Rx.Observable(observer => {
gm(binary)
.resize(pictureSize.width)
.toBuffer('jpg', function(err, buffer) {
console.log('BUFFER');
if (err) {
console.log(err);
observer.error(err);
} else {
observer.next({binary: buffer, pictureSize: pictureSize});
observer.complete('done');
}
});
}).subscribe(
(resizedImage) => {
console.log(resizedImage);
const binary = resizedImage.binary;
const pictureSize = resizedImage.pictureSize;
const fileName = image.split('.')[0];
const fileExtension = image.split('.')[1];
fs.writeFile(`./testImages/${fileName}${pictureSize.suffix}.${fileExtension}`, binary);
})
}
var readFile$ = new Rx.Observable.bindNodeCallback(fs.readFile);
readFile$(`./${image}`)
.zip(Rx.Observable.of(pictureSizes), (binary, sizes) =>
Rx.Observable.of({ binary: binary, sizes: sizes }))
.mergeMap(x => x.value.sizes.map(pictureSize =>
resizeImage$(x.value.binary, pictureSize)))
.subscribe()
Вы говорите, что то, что вы работаете для применения суффикса файла, за исключением? В качестве теста, если вы закомментируете все «pictureSizes» за исключением одного, получите правильный, не поврежденный выходной файл? – cartant
Нет, извините, я не понял ... Суффикс файла - дополнительная проблема. Конечный файл поврежден только одним объектом pictureSize. –