Прежде всего: что я пытаюсь сделать?Как масштабировать изображения на холсте html5 с лучшей интерполяцией?
У меня есть приложение для просмотра изображений. Он использует элемент холста для рендеринга изображения. Вы можете увеличить масштаб, вы можете уменьшить масштаб, и вы можете перетащить его. Эта часть работает совершенно прямо сейчас.
Но скажем, у меня есть изображение с большим количеством текста. Он имеет разрешение 1200x1700, а у моего холста 1200x900. Первоначально, при увеличении, это приводит к отображению разрешения ~ 560x800.
Моего фактический рисунок выглядит следующим образом:
drawImage(src, srcOffsetX, srcOffsetY, sourceViewWidth, sourceViewHeight,
destOffsetX, destOffsetY, destWidth, destHeight);
Небольшой текст на этом изображении выглядит очень, очень плохо, особенно по сравнению с другими зрителями изображений (например, IrfanView), или даже HTML < IMG> элемента.
Я понял, что алгоритм интерполяции браузеров является причиной этой проблемы. Сравнение разных браузеров показало, что Chrome делает масштабированные изображения лучшими, но все же недостаточно хорошими.
Ну, я искал в каждом углу Interwebs в течение 4-5 часов подряд и не нашел то, что мне нужно. Я нашел параметр «imageSmoothingEnabled», стили CSS-изображения, которые нельзя использовать на холсте, рендеринг на позициях с плавающей точкой и многие варианты реализации алгоритмов интерполяции JavaScript (это far для замедления для моей цели).
Вы можете спросить, почему я говорю вам все это: чтобы сэкономить ваше время, чтобы дать мне ответы я уже знаю :))
Итак: есть любой хороший и быстрый способ, чтобы лучше интерполяции ? Моя идея состоит в том, чтобы создать объект изображения, изменить его размер (потому что img имеет хорошую интерполяцию при масштабировании!) И затем визуализирует его. К сожалению, применение img.width, по-видимому, влияет только на отображаемую ширину ...
Большое спасибо за ваши ответы !! :)
Обновление: Благодаря Саймону, я мог бы решить свою проблему. Вот динамический алгоритм масштабирования, который я использовал. Обратите внимание, что он поддерживает соотношение сторон, параметр высоты - только для предотвращения более плавающих вычислений. Он только масштабируется прямо сейчас.
scale(destWidth, destHeight){
var start = new Date().getTime();
var scalingSteps = 0;
var ctx = this._sourceImageCanvasContext;
var curWidth = this._sourceImageWidth;
var curHeight = this._sourceImageHeight;
var lastWidth = this._sourceImageWidth;
var lastHeight = this._sourceImageHeight;
var end = false;
var scale=0.75;
while(end==false){
scalingSteps +=1;
curWidth *= scale;
curHeight *= scale;
if(curWidth < destWidth){
curWidth = destWidth;
curHeight = destHeight;
end=true;
}
ctx.drawImage(this._sourceImageCanvas, 0, 0, Math.round(lastWidth), Math.round(lastHeight), 0, 0, Math.round(curWidth), Math.round(curHeight));
lastWidth = curWidth;
lastHeight = curHeight;
}
var endTime =new Date().getTime();
console.log("execution time: "+ (endTime - start) + "ms. scale per frame: "+scale+ " scaling step count: "+scalingSteps);
}
Под «лучшей интерполяцией» вы подразумеваете интерполяцию, предназначенную для лучшей читаемости текста при уменьшении? –
лучшая интерполяция в целом. плохое качество текста - это всего лишь самая заметная вещь, которую вы видите ... и читаемость текста, к сожалению, очень важна для этого проекта. но если вы знаете способ сделать текст лучше, пожалуйста, скажите мне тогда! – Kumpu
Возможный дубликат [Html5 canvas drawImage: как применять сглаживание] (http://stackoverflow.com/questions/17861447/html5-canvas-drawimage-how-to-apply-antialiasing) – K3N