2014-12-24 4 views
13

Как я могу удалить данные EXIF ​​из загруженного изображения через javascript? Я в настоящее время в состоянии получить доступ к данным EXIF, используя this exif-js plugin, например:Strip EXIF ​​данные из изображения

EXIF.getData(oimg, function() { 
    var orientation = EXIF.getTag(this, "Orientation"); 
}); 

Однако я не нашел какой-либо способ фактически удалить данные Exif, только для его получения.

Более конкретно, я пытаюсь сделать это, чтобы избавиться от ориентации Exif-данных, которые вращают мое изображение в определенных браузерах.

+0

@Alex В настоящее время не представляется возможным для меня, чтобы использовать PHP для выполнения этой задачи. Даже если нет встроенной функции Javascript, которая позволяет это, плагин был бы приемлемым. Как я могу изменить свой вопрос, чтобы быть менее широким? –

+0

@alex, также с nodejs, это не настолько экстремально, что вы хотели бы справиться с этим с помощью JS. Даже если этот вопрос не об этом. – fejese

ответ

17

Ниже приведена небольшая демонстрация, выберите изображение с данными ориентации, чтобы посмотреть, как он выглядит и с ним (современные браузеры).

http://jsfiddle.net/mowglisanu/frhwm2xe/3/

<input id="erd" type="file"/> 
var input = document.querySelector('#erd'); 
input.addEventListener('change', load); 
function load(){ 
    var fr = new FileReader(); 
    fr.onload = process; 
    fr.readAsArrayBuffer(this.files[0]); 
    window.open(URL.createObjectURL(this.files[0]), "_blank", "toolbar=yes, scrollbars=yes, resizable=yes, top=500, left=500, width=400, height=400"); 
} 
function process(){ 
    var dv = new DataView(this.result); 
    var offset = 0, recess = 0; 
    var pieces = []; 
    var i = 0; 
    if (dv.getUint16(offset) == 0xffd8){ 
     offset += 2; 
     var app1 = dv.getUint16(offset); 
     offset += 2; 
     while (offset < dv.byteLength){ 
      console.log(offset, '0x'+app1.toString(16), recess); 
      if (app1 == 0xffe1){ 

       pieces[i] = {recess:recess,offset:offset-2}; 
       recess = offset + dv.getUint16(offset); 
       i++; 
      } 
      else if (app1 == 0xffda){ 
       break; 
      } 
      offset += dv.getUint16(offset); 
      var app1 = dv.getUint16(offset); 
      offset += 2; 
     } 
     if (pieces.length > 0){ 
      var newPieces = []; 
      pieces.forEach(function(v){ 
       newPieces.push(this.result.slice(v.recess, v.offset)); 
      }, this); 
      newPieces.push(this.result.slice(recess)); 
      var br = new Blob(newPieces, {type: 'image/jpeg'}); 
      window.open(URL.createObjectURL(br), "_blank", "toolbar=yes, scrollbars=yes, resizable=yes, top=500, left=500, width=400, height=400"); 
     } 
    }  
} 
+2

Есть ли способ заменить ориентацию на 1, а не удалять все данные exif? @Musa – danial

+0

@ danial конечно, вам просто нужно знать, где находятся данные ориентации и установить значение в представлении данных, что-то вроде 'dataview.setUint16 (orientationOffset, newValue)' – Musa

+0

Как узнать, где находятся данные ориентации? – danial

Смежные вопросы