Изменение размера изображения перед загрузкой



Мне нужно предоставить пользователю возможность загружать фотографии на свой веб-сайт в формате jpeg. Тем не менее, фотографии очень большие в оригинальном размере, и я хотел бы сделать изменение размера перед загрузкой очень легким для пользователя. Кажется, мои единственные варианты-это клиентское приложение, которое изменяет размер фотографий перед их загрузкой через веб-службу или клиентский JavaScript-крючок для операции загрузки, которая изменяет размер изображений. Второй вариант очень предварительный, потому что я этого не делаю есть библиотека изменения размера изображения JavaScript, и будет трудно заставить JavaScript запустить мой текущий инструмент изменения размера, ImageMagick.



Я уверен, что это не слишком необычный сценарий, и некоторые предложения или указатели на сайты, которые делают это, будут оценены.

611   8  

8 ответов:

У вас есть несколько вариантов:

  1. Java
  2. ActiveX (только на windows)
  3. Silverlight
  4. вспышка
  5. гибкий график работы
  6. Google Gears (самая последняя версия способна изменять размер и перетаскивать с рабочего стола)

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

мое предложение-найти решение, которое будет делать 80% того, что вам нужно, и настроить его в соответствии с вашими потребностями.

в 2011 году мы можем знать, сделать это с помощью API-интерфейса файла и холста. Это работает пока только в firefox и chrome. Вот пример :

var file = YOUR_FILE,
    fileType = file.type,
    reader = new FileReader();

reader.onloadend = function() {
  var image = new Image();
      image.src = reader.result;

  image.onload = function() {
    var maxWidth = 960,
        maxHeight = 960,
        imageWidth = image.width,
        imageHeight = image.height;

    if (imageWidth > imageHeight) {
      if (imageWidth > maxWidth) {
        imageHeight *= maxWidth / imageWidth;
        imageWidth = maxWidth;
      }
    }
    else {
      if (imageHeight > maxHeight) {
        imageWidth *= maxHeight / imageHeight;
        imageHeight = maxHeight;
      }
    }

    var canvas = document.createElement('canvas');
    canvas.width = imageWidth;
    canvas.height = imageHeight;

    var ctx = canvas.getContext("2d");
    ctx.drawImage(this, 0, 0, imageWidth, imageHeight);

    // The resized file ready for upload
    var finalFile = canvas.toDataURL(fileType);
  }
}

reader.readAsDataURL(file);

есть несколько технологий, способных Plupload tool, который заявляет, что он может сделать изменение размера перед загрузкой, но я еще не пробовала. Я также нашел подходящий ответ в моем вопрос о двоичной обработке изображений javascript libs.

Я думаю, что вам нужна Java или ActiveX для этого. Например Тонкая Загрузка Изображения

то, что говорят ЯО и руссау-правда. Причина в том, что JavaScript не имеет доступа к локальной файловой системе из соображений безопасности. Если JavaScript может "видеть" ваши файлы изображений, он может видеть любой файл, и это опасно.

для этого вам нужен элемент управления на уровне приложения, а это означает Flash, Java или Active-X.

к сожалению, вы не сможете изменить размер изображений в Javascript. Это возможно в Silverlight 2 tho.

Если вы хотите купить что-то уже сделано: Изображения Тема Браузера Как Никто Другой Загрузчик довольно впечатляет - $USD250 для версий ActiveX и Java. На сайте есть некоторые демо-версии, я уверен, что facebook использует тот же элемент управления.

чистое решение JavaScript. Мой код изменяет размер JPEG с помощью билинейной интерполяции, и он не теряет exif.

https://github.com/hMatoba/JavaScript-MinifyJpegAsync

function post(data) {
    var req = new XMLHttpRequest();
    req.open("POST", "/jpeg", false);
    req.setRequestHeader('Content-Type', 'image/jpeg');
    req.send(data.buffer);
}

function handleFileSelect(evt) {
    var files = evt.target.files;

    for (var i = 0, f; f = files[i]; i++){
        var reader = new FileReader();
        reader.onloadend = function(e){
            MinifyJpegAsync.minify(e.target.result, 1280, post);
        };
        reader.readAsDataURL(f);
    }
}

document.getElementById('files').addEventListener('change', handleFileSelect, false);

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

ниже я использовал MarvinJ чтобы создать запускаемый код на основе примера на следующей странице: "обработка изображений на стороне клиента перед отправкой на сервер"

в основном я использую метод Марвин.масштаб.(..) чтобы изменить размер изображения. Затем я загружаю изображение в виде большого двоичного объекта (используя метод изображения.toBlob()). Сервер отвечает, предоставляя URL-адрес полученного изображения.

/***********************************************
 * GLOBAL VARS
 **********************************************/
var image = new MarvinImage();

/***********************************************
 * FILE CHOOSER AND UPLOAD
 **********************************************/
 $('#fileUpload').change(function (event) {
	form = new FormData();
	form.append('name', event.target.files[0].name);
	
	reader = new FileReader();
	reader.readAsDataURL(event.target.files[0]);
	
	reader.onload = function(){
		image.load(reader.result, imageLoaded);
	};
	
});

function resizeAndSendToServer(){
  $("#divServerResponse").html("uploading...");
	$.ajax({
		method: 'POST',
		url: 'https://www.marvinj.org/backoffice/imageUpload.php',
		data: form,
		enctype: 'multipart/form-data',
		contentType: false,
		processData: false,
		
	   
		success: function (resp) {
       $("#divServerResponse").html("SERVER RESPONSE (NEW IMAGE):<br/><img src='"+resp+"' style='max-width:400px'></img>");
		},
		error: function (data) {
			console.log("error:"+error);
			console.log(data);
		},
		
	});
};

/***********************************************
 * IMAGE MANIPULATION
 **********************************************/
function imageLoaded(){
  Marvin.scale(image.clone(), image, 120);
  form.append("blob", image.toBlob());
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://www.marvinj.org/releases/marvinj-0.8.js"></script>
<form id="form" action='/backoffice/imageUpload.php' style='margin:auto;' method='post' enctype='multipart/form-data'>
				<input type='file' id='fileUpload' class='upload' name='userfile'/>
</form><br/>
<button type="button" onclick="resizeAndSendToServer()">Resize and Send to Server</button><br/><br/>
<div id="divServerResponse">
</div>

Comments

    Ничего не найдено.