Могу ли я получить доступ к файлу данных тега img из JavaScript

Я хочу из JavaScript получить доступ как переменную к файлу, загруженному как изображение в теге img.

Я хочу получить доступ не к его имени, а к реальным данным.

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

Можно ли это сделать? Если да, то как?

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

если вам интересно, что я делаю, я также спросил это: stackoverflow.com/questions/298057/…

BCS 18.11.2008 11:35

Я думаю, вы имели в виду «Я не хочу получать доступ к его имени», а не «Я не хочу получать доступ к его имени».

Piskvor left the building 18.11.2008 11:43

Почему ___ оно притяжательное оно отличается от притяжательного все остальное?!?! : b

BCS 18.11.2008 21:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
3
3 770
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Попробуй это:

img = new Image(); 
img.src = "imagefile.jpg";

Я знал, как получить доступ к имя изображения. Но это нет то, чем я хочу заниматься.

BCS 18.11.2008 10:33

Некоторые браузеры поддерживают строка в кодировке Base64 как img src, но не все. Это выглядело бы так:

<img src = "data:image/gif;base64,R0lGODl......j5+g4JADs = ">

Когда вы делаете это таким образом, вы можете по крайней мере фальшивый получить доступ к фактическим данным, но, как я уже сказал, он не поддерживается на 100%. Кроме этого - никак.

Настоящий вопрос: чего вы пытаетесь достичь? В большинстве случаев (95%, возможно, больше) повторные перезагрузки изображений улавливаются кешем браузера, и в этом случае простое изменение img.src имеет тот же эффект и не вызывает сетевого трафика (если это то, о чем вы беспокоитесь).

вы можете нарисовать изображение тега img на холсте HTML с помощью canvas.drawImage

Вы можете попробовать загрузить изображение с помощью AJAX, но тогда вы можете столкнуться с ограничениями междоменного сценария.

О других способах доступа к данным изображения я не знаю.

Ответ принят как подходящий
// Download the image data using AJAX, I'm using jQuery
var imageData = $.ajax({ url: "MyImage.gif", async: false }).responseText;

// Image data updating magic
imageDataChanged = ChangeImage(imageData);

// Encode to base64, maybe try the webtoolkit.base64.js library
imageDataEncoded = Base64Encode(imageDataChanged);

// Write image data out to browser (FF seems to support this)
document.write('<img src = "data:image/gif;base64,' + imageDataEncoded + '">');

... это самая крутая вещь, которую я видел на SO

username 28.01.2009 21:56

Если вы используете Firefox (а я думаю, Opera и, возможно, Safari; прямо сейчас я не могу проверить), вы можете нарисовать изображение на элементе холста и использовать getImageData.

Это будет работать примерно так:

var img = document.getElementById("img_id");
var canvas = document.getElementById("canvas_id");
var context = canvas.getContext("2d");

var imageData = context.getImageData(0, 0, context.width, context.height);

// Now imageData is an object with width, height, and data properties.
// imageData.data is an array of pixel values (4 values per pixel in RGBA order)

// Change the top left pixel to red
imageData.data[0] = 255; // red
imageData.data[1] = 0;   // green
imageData.data[2] = 0;   // blue
imageData.data[3] = 255; // alpha

// Update the canvas
context.putPixelData(imageData, 0, 0);

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

var index = (y * imageData.width + x) * 4;

и добавьте смещение для каждого канала (0 для красного, 1 для зеленого, 2 для синего, 3 для альфа)

Кстати: по соображениям безопасности использование изображения из другого домена «испортит» холст и отключит чтение данных пикселей.

Kornel 19.11.2008 01:57

Другие вопросы по теме