Показать сообщение отдельно
Старый 05.05.2016, 21:56   #1
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
node.js + imagemagick

Добрый вечер, Булчане!

Возникла проблема, причём на довольно ровном месте. В своём чатике я решил добавить передачу фоточек и картиночек всяких. Собственно, в этом проблемы не возникло - влоб передаю данные картинки через socket.io или из браузера, или из мобилки. На сервере из сохраняю как то вот так:
fs.writeFile( __dirname + "/uploads/images/"+filename, msgParsed.text, 'binary', function(err) {
...
});
Filename - имя файла (я его сам генерирую, сразу оговорка - расширения файл не имеет), msgParsed - это распарсеный json с клиента, msgParsed.text - собственно содержимое картинки. Потом на клиенте просто запрашиваю данные этой картинки и вставляю в нужные места (в <img src/> или в UIImage на яблофоне).
В общем? конкретно с этим - проблем нет, всё сохраняется и отображается как надо. Проблема в другом - я решил делать ресайз принимаемых картинок, ибо во первых - нефиг их в мегаразрешениях хранить, во вторых - надо делать превьюшки картинок, чтоб не грузить канал мегаданными.
Ну, думаю, всё фигня, 5 минут и вопрос решён - гугл в руки и вперёд.
apt-get install Imagemagick 
npm install easyimage
Далее берём простейший код и вроде как радуемся данным изображения (baseText - имя файла):
var easyimage = require('easyimage');
easyimage.info(__dirname + '/uploads/images/'+baseText).then(
    function(file) {
        console.log(file);
    }, function (err) {
        console.log(err);
    }
);
И, казалось бы, вот оно - счастье. Но хрен тут был, имеем ошибку:
[Error: identify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.]
Пол дня рылся, не понял в чём проблема. Ну, думаю, ладно, припишу расширение (файл был png, потому приписал, соответственно, ".png"). Запускаю запрос файла заново - имею ошибку номер 2:
[Error: identify: improper image header `.../uploads/images/image_8b7cea9f-a80a-4069-a326-273b6ecc8c65.png' @ error/png.c/ReadPNGImage/3930.
И вот тут я понял, что вообще не понял. Файл сохранял по всем канонам гугла - всеми возможными способами. И, если файл сохранить убрав 'binary', и потом проверить, то внутри всё будет вроде как нормально:
data:image/png;base64,...
Причём эта сохранённая картинка не открывается ни одним просмотрщиком, а в тот единственный раз, когда мне каким-то чудом удалось таки добиться до её данных из ноды (через модуль file-type и какой-то из вариантов сохранения изображения использовал), то мне написало что mime у неё "text/plane". Что я делаю не так? И почему оно отображается в браузере и в UIImage нормально (причём в обеих вариантах - при сохранении как 'binary' и как обычный файл)?
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием