Проблема с ImageIO.read заключается в том, что она очень медленная. Все, что вам нужно сделать, это прочитать заголовок изображения, чтобы получить размер. ImageIO.getImageReader
является идеальным кандидатом.
Вот пример Groovy, но то же самое относится и к Java
def stream = ImageIO.createImageInputStream(new ByteArrayInputStream(inputStream))
def reader = ImageIO.getImageReader(getReaderByFormat(format))
reader.setInput(stream, true)
println "width:reader.getWidth(0) -> height: reader.getHeight(0)"
. Производительность была такой же, как с использованием java-библиотеки SimpleImageInfo.
https://github.com/cbeust/personal/blob/master/src/main/java/com/beust/SimpleImageInfo.java
window.name имеет специальную цель и предполагается, что это строка. Кажется, что Chrome явно передал его в строку, поэтому var name = {};
фактически заканчивает тем, что дает глобальную переменную name
(т.е. window.name
) значение "[object Object]"
. Поскольку это примитив, свойства (name.FirstName
) не будут «прилипать».
Чтобы обойти эту проблему, не используйте name
в качестве глобальной переменной.
Ваша name
переменная на самом деле window.name
, поскольку переменные верхнего уровня, объявленные с помощью var
, привязаны к глобальному объекту.
Спецификация HTML5 требует, чтобы window.name
a DOMString
. Это означает, что значение window.name
может быть только последовательностью символов , а не объектом.
В Chrome попытка использовать window.name
для хранения чего-либо, кроме примитивная строка будет принуждать значение к примитивной строке. Например:
window.name = {};
window.name === "[object Object]"; // true
Вы можете избежать этой проблемы, используя переменную name
, которая не находится в области верхнего уровня:
(function() {
var name = {};
// this `name` is not `window.name`
// because we're not in the top-level scope
console.log(name);
})();
window.name
используется для установки имени окна, а так как имя окна может быть только строкой, все, что вы установите на window.name
, преобразуется в строку. И строки, как примитивные значения, не могут иметь свойств. Решение состоит в том, чтобы использовать другое имя переменной или другую область.
В качестве альтернативы вы можете использовать window.name
, как вам нравится, если у вас есть этот код в первую очередь. Я не рекомендую это вообще, но, как доказательство концепции:
(function () {
var _name;
window.__defineGetter__('name', function () {
return _name;
});
window.__defineSetter__('name', function (v) {
_name = v;
});
})();
Кроме того, вместо new Object
вы должны использовать {}
. Кроме того, что он более краток, он также более эффективен и более ясен.
name
как зарезервированное слово, так как некоторые хосты предоставляют функции свойствоname
также (я был укушен этим раньше), закрытие не будет его уменьшать и т. Д. – Dagg Nabbit 9 May 2012 в 22:24