Конвертировать изображение в JPG из HTML на стороне клиента (JavaScript) - PullRequest
3 голосов
/ 24 января 2011

У меня есть HTML-форма, где пользователи вставляют изображение (вход). Мои пользователи могут быть не опытными пользователями, поэтому они могут захотеть вставить много разных типов формата изображения. Однако я хочу, чтобы пользователь отправлял только файлы jpg / gif / png. Один из вариантов - просто заблокировать другие типы файлов, однако мне было интересно, могу ли я конвертировать файлы на стороне клиента (я не хочу отправлять очень большой файл и конвертировать его на сервере). Поэтому я могу думать только о том, чтобы использовать javacript.

Итак, кто-нибудь знает, как сделать преобразование формата изображения в JavaScript? И поместите этот результат изображения как значение html: input?

Спасибо!

Ответы [ 6 ]

3 голосов
/ 24 января 2011

тл; доктор: не беспокойся

Это может быть теоретически возможно, но я бы настоятельно рекомендовал против этого. Можно создать элемент javascript Img, который ссылается на URL-адрес, введенный пользователем. Затем вы можете нарисовать это изображение на холсте HTML5.

Затем вы можете вручную получить доступ к данным на холсте и проанализировать / преобразовать изображение в соответствующий формат. Тогда можно будет отправить этот Base64 или URL-кодирование на сервер, который затем сможет вернуть изображение клиенту.

Это, конечно, совершенно безумие, и стоит НЕ . Это решение потребовало бы реализации сжатия JPG в javascript, что, хотя технически возможно, вероятно, невозможно из-за ограничений браузера (например, скорости).

2 голосов
/ 24 января 2011

Вы можете использовать Java-апплет (аналогично тому, как апплет для загрузки фотографий в Facebook для предварительной подготовки / размера изображений перед загрузкой), у вас не так много других доступных вариантов.Выполнение преобразования на стороне клиента будет очень трудным, но это возможно (с помощью плагинов для браузера).Исключительно полагаясь на JavaScript, это невозможно.Даже если бы это было так, это было бы опасно из-за различных реализаций в разных браузерах.Другие решения не будут занимать много места (пользователю нужно будет установить зависимость на своем компьютере).

Лучшим и наиболее надежным вариантом будет выполнение преобразования на стороне сервера (используя Apache Batik, есливы знакомы с Java) в любой имеющейся у вас технологии и знакомы с ней.

2 голосов
/ 24 января 2011

Нет.Невозможно.JavaScript не может манипулировать двоичным содержимым

1 голос
/ 24 января 2011

Просто невозможно.

Нет поддержки Javascript на стороне клиента для выполнения манипуляций с изображениями.

Вы можете использовать API расширяемости из самых популярных на рынке веб-браузеров, таких как Internet Explorer, Firefox, Safari., Chrome или Opera, но это не стандартное решение на основе Javascript.В любом случае, это будет решение на стороне клиента, и некоторые из этих API поддерживают манипуляции с документами, поэтому, возможно, вы можете обрабатывать некоторые виды щелчков в определенных элементах HTML с помощью определенного класса CSS.

0 голосов
/ 19 июля 2017

Вы можете использовать jimp-браузер (возможно, с WebWorkers).

https://github.com/oliver-moran/jimp/tree/master/browser

Эта библиотека не использует метод toDataUrl canvas и, например, например, также работает с большими изображениями в iOS (см. «Известные проблемы» здесь http://caniuse.com/#search=toDataURL).

0 голосов
/ 13 июня 2014

Это возможно, но не рекомендуется.

Для начала вам нужно получить данные exif для правильного поворота изображения, если оно исходит от мобильного телефона. Затем вам нужно проверить тип файла и преобразовать его во что-то, что вы можете загрузить через ajax. Для этого вам потребуется браузер, который может обрабатывать «toDataURL» на объекте canvas:

function supportsToDataURL() {
    var c = document.createElement("canvas");
    var data = c.toDataURL("image/jpeg");
    return (data.indexOf("data:image/jpeg") == 0)        
}

Как только вы получите файл, мне нравится рендерить его в мегапикселях: мегапиксельная библиотека

Прослушайте событие загрузки изображения следующим образом:

var img = new Image()
img.onload = function() {
    // do some stuff like rendering image to a canvas
}
var mpImg = new MegaPixImage(file);
mpImg.render(img, { quality: 1, maxWidth: 1024 });  

Затем вы можете записать изображение на холст:

var canvas = document.createElement('canvas'),
    ctx = canvas.getContext('2d');

canvas.width = sourceWidth;
canvas.height = sourceHeight;

ctx.drawImage(img, 0, 0, sourceWidth, sourceHeight);
var url = canvas.toDataURL();
// or if you want a specific file type
var jpeg = canvas.toDataURL("image/jpeg");
var png = canvas.toDataURL("image/png");

ПРИМЕЧАНИЕ: некоторые версии Android могут поддерживать «toDataURL», но не полную спецификацию. Они могут отображать только png-файлы и т. Д. Это только одна из многих проблем, с которыми вам придется столкнуться при совместимости браузеров при рендеринге изображений.

Поверьте мне, я потратил около 16 часов на создание инструмента обрезки и настройки изображений для мобильного веб-приложения, и это непростая задача.

Лучшим решением было бы выбрать пользователя, преобразовать его в base64 и загрузить через ajax. Затем преобразуйте вещи на стороне сервера и (при необходимости) отправьте что-нибудь обратно пользователю, которого они могут просматривать.

Я работаю над плагином, позволяющим загружать изображения с мобильных устройств, и я добавлю сюда ссылку, когда это будет сделано.

...