Uzyskać dane obrazu w JavaScript?
Mam zwykłą stronę HTML z kilkoma obrazkami (zwykłe znaczniki HTML <img />
). Chciałbym, aby ich zawartość, base64 zakodowane najlepiej, bez konieczności ponownego pobierania obrazu (tj. jest już załadowany przez przeglądarkę, więc teraz chcę zawartość).
Chciałbym to osiągnąć z Greasemonkey i Firefox.
6 answers
Uwaga: {[6] } to działa tylko wtedy, gdy obraz pochodzi z tej samej domeny co Strona, lub ma atrybut crossOrigin="anonymous"
i serwer obsługuje CORS. To również nie da ci oryginalnego pliku, ale ponownie zakodowaną wersję. Jeśli chcesz, aby wynik był identyczny z oryginałem, zobacz odpowiedź kaIdō .
Będziesz musiał utworzyć element canvas o prawidłowych wymiarach i skopiować dane obrazu za pomocą funkcji drawImage
. Następnie możesz użyć funkcji toDataURL
, aby uzyskać dane: url z zakodowanym obrazem base-64. Zauważ, że obraz musi być w pełni załadowany, albo po prostu otrzymasz pusty (czarny, przezroczysty) obraz.
function getBase64Image(img) {
// Create an empty canvas element
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
// Copy the image contents to the canvas
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
// Get the data-URL formatted image
// Firefox supports PNG and JPEG. You could check img.src to
// guess the original format, but be aware the using "image/jpg"
// will re-encode the image.
var dataURL = canvas.toDataURL("image/png");
return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}
Uzyskanie obrazu w FORMACIE JPEG nie działa na starszych wersjach (około 3.5) Firefoksa, więc jeśli chcesz go obsługiwać, musisz sprawdzić zgodność. Jeśli kodowanie nie jest obsługiwane, domyślnie będzie to "image / png".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:09
Ta funkcja pobiera adres URL, a następnie zwraca obraz BASE64
function getBase64FromImageUrl(url) {
var img = new Image();
img.setAttribute('crossOrigin', 'anonymous');
img.onload = function () {
var canvas = document.createElement("canvas");
canvas.width =this.width;
canvas.height =this.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0);
var dataURL = canvas.toDataURL("image/png");
alert(dataURL.replace(/^data:image\/(png|jpg);base64,/, ""));
};
img.src = url;
}
Nazwij to tak :
getBase64FromImageUrl("images/slbltxt.png")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 18:18:36
Nadchodzi długo po, ale żadna z odpowiedzi tutaj nie są całkowicie poprawne.
Po narysowaniu na płótnie, przekazany obraz jest nieskompresowany + wszystkie wstępnie pomnożone.
Po wyeksportowaniu jest nieskompresowany lub skompresowany za pomocą innego algorytmu i nie zwielokrotniony.
Wszystkie przeglądarki i urządzenia będą miały różne błędy zaokrąglania występujące w tym procesie
(zobacz Canvas fingerprinting ).
Więc jeśli ktoś chce wersję Base64 pliku graficznego, musi request it again (większość czasu będzie pochodzić z pamięci podręcznej), ale tym razem jako Blob.
Następnie możesz użyć FileReader , aby odczytać go jako ArrayBuffer lub jako dataURL.
function toDataURL(url, callback){
var xhr = new XMLHttpRequest();
xhr.open('get', url);
xhr.responseType = 'blob';
xhr.onload = function(){
var fr = new FileReader();
fr.onload = function(){
callback(this.result);
};
fr.readAsDataURL(xhr.response); // async call
};
xhr.send();
}
toDataURL(myImage.src, function(dataURL){
result.src = dataURL;
// now just to show that passing to a canvas doesn't hold the same results
var canvas = document.createElement('canvas');
canvas.width = myImage.naturalWidth;
canvas.height = myImage.naturalHeight;
canvas.getContext('2d').drawImage(myImage, 0,0);
console.log(canvas.toDataURL() === dataURL); // false - not same data
});
<img id="myImage" src="https://dl.dropboxusercontent.com/s/4e90e48s5vtmfbd/aaa.png" crossOrigin="anonymous">
<img id="result">
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-17 18:22:17
Oprócz odpowiedzi Mateusza, chciałbym powiedzieć, że obraz.szerokość i obraz.wysokość zwraca wyświetlony Rozmiar obrazu (i przycina obraz podczas rysowania go na płótnie)
Zamiast tego użyj naturalWidth i naturalHeight, które używają obrazu o rzeczywistych rozmiarach.
Zobacz http://www.whatwg.org/specs/web-apps/current-work/multipage/edits.html#dom-img-naturalwidth
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-11 16:00:04
Bardziej nowoczesna wersja odpowiedzi kaIdō za pomocą fetch brzmiałaby:
function toDataURL(url) {
return fetch(url)
.then((response)=> {
return response.blob();
})
.then(blob=> {
return URL.createObjectURL(blob);
});
}
Https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-21 21:36:06
function encodeImageFileAsURL(cb) {
return function() {
var file = this.files[0];
var reader = new FileReader();
reader.onloadend = function() {
cb(reader.result);
}
reader.readAsDataURL(file);
}
}
$('#inputFileToLoad').change(encodeImageFileAsURL(function(base64Img) {
$('.output')
.find('textarea')
.val(base64Img)
.end()
.find('a')
.attr('href', base64Img)
.text(base64Img)
.end()
.find('img')
.attr('src', base64Img);
}));
@import url('//netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css'); body{ padding: 20px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h2>Input</h2>
<form class="input-group" id="img2b64">
<input id="inputFileToLoad" type="file" onchange="encodeImageFileAsURL();" />
</form>
<hr>
Oto działający przykład: - upload & get Image Data Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-15 05:51:35