2012-04-24 3 views
0

Чтобы избежать агрессивной коллекции кэширования/удаления мусора из Firefox, мы экспериментировали с способами хранения ссылок на изображения. Сохранение ссылок на объекты «new Image()», похоже, работает, но использует много памяти.Преобразование 64-битных строк в jpeg с помощью javascript/css

Я сейчас экспериментирует с использованием

$.ajax({ 
    url: "http://localhost/360/img/frames/compressed/frame0470.jpg", 
    dataType: "text", 
    success: function(r) { 
     console.log(r); 
    } 
}); 

получить base64 строку на изображении (которые, предположительно, могут быть сохранены в меньше памяти, чем объект изображения и не будет предметом сбора мусора изображения Фирефокса). Но как я могу преобразовать это обратно в jpeg?

+4

Я предполагаю, что вы имеете в виду base64. И то, что вы получаете как ответ, - это текстовое представление изображения. не основа64. Но, однако, то, что вы пытаетесь сделать, звучит как плохая идея. Обработать кеширование серверов с истечением срока действия. – binarious

+0

@binarious - Возможно, я ошибаюсь в этом, потому что я не слишком глубоко изучил, но кажется, что в последних версиях firefox реализовала агрессивную функцию сбора мусора, благодаря которой изображения (даже если они в настоящее время используются сетью страница на неконцентрированной вкладке) регулярно удаляются из памяти (предположительно для повышения производительности). Может быть, «кэширование» - это не тот термин, который я должен использовать, - я исправлю вопрос, чтобы отразить это. – wheresrhys

+0

Что не так? – binarious

ответ

0

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

Во-первых, прочитать MDC документы здесь, чтобы retrive правильную бинарную строку изображения https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest#Receiving_binary_data_in_older_browsers

Во-вторых, двоичная строка может быть преобразована в base64 по window.btoa().

В-третьих, строка изображения base64 может отображаться путем построения URL-адреса данных. Я уверен, что вы уже знаете, как это сделать.

==

Сравнение с фактическими двоичных данных, двоичные строки расходов в 4 раза больше памяти, так как каждый символ в строке на самом деле 4 байта в памяти как Javascript использует UCS-2 внутри. Base64 string стоит 4 * 1,3 = 5.2x больше памяти. Данные Base64 на 130% больше, чем исходные данные.

Удобный способ обработки двоичных данных в Javascript - работать с объектом Blob. Но я все равно не видел, чтобы изображение было отображено как изображение, поэтому ...

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

< холст > имеет встроенную функцию toDataURL(), которая предоставляет нужные данные, но если вы уйдете с выселением изображения, то вам это не понадобится.

+0

Это два ответа в сообщении! Попробуйте оба из них и скажите мне результат! – timdream

+0

В итоге мы отправились на хранение изображений, которые нам нужно будет использовать в объектах Image и реализовать нашу собственную утилиту сбора гаражей, чтобы убедиться, что было сохранено минимальное количество изображений, но ваш ответ выглядит хорошо. Если мне когда-либо понадобится использовать строки изображений base64, я передумаю это. – wheresrhys

0

Я не получить причину вы хотите достичь, но ответить на ваш вопрос:

Основная идея:

Вы должны кодировать эти данные в Base64:

var base64Data = Base64.encode(r); 

Дисплей Base64 изображение:

$('<img>') // create new image 
    .attr('src', 'data:image/jpeg;base64,' + base64Data) // set image data as b64 
    .appendTo('body'); // add the image tag to the body element (or any other) 

Но практически это кажется немного сложнее: http://emilsblog.lerch.org/2009/07/javascript-hacks-using-xhr-to-load.html

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