2015-09-10 2 views
1

Я создаю игру в стиле ретро, ​​в которой используются пиксельные изображения. Я еще не создал эти образы, потому что хотел знать, как лучше всего это делать.HTML5 Canvas bitmaps

Эти изображения, вероятно, будут 16 или 32 квадратами PX, но я хотел бы иметь возможность масштабировать изображения так же сильно, как мне нравится, просто без размытия/искажения.

Какой формат следует использовать? И как мне импортировать их на мой холст. также?

РЕДАКТИРОВАТЬ # 1: Исправлена ​​опечатка & Вставить Q еще раз по теме. (Спасибо Спенс за указание его)

+0

HTML-5 Canvas может обрабатывать различные типы общего изображения, я бы рекомендовал использовать '.PNG'. Программное обеспечение изображения может быть вашим предпочтением: MS Paint (не поддерживает прозрачность), Gimp, Photoshop и т. Д. Все в порядке. * Примечание, запрашивая ресурсы за пределами сайта, не соответствует теме для этого сайта *, но я надеюсь, что мой комментарий помог. –

+0

Я читал, что графика может оказаться размытой, если они имеют низкое разрешение. В прошлом цвета в изображениях, которые я сделал/отредактировал, были смешанными/смешанными. Это было тогда, когда я едва знал компьютеры. (In xp paint) –

+0

Я сделал это по теме снова, извините за это. –

ответ

0

Создание больших изображений значков, к которым применяется эффект плитки 16x16 или 32x32. Затем, когда вы пишете их на холст (после загрузки изображения, конечно) масштабировать их до размера вы хотите использовать

context.drawImage(img,x,y,width,height); 

Размеры файлов вряд ли сильно прыгать, так как каждая плитка должна сжать довольно легко.

+0

Итак, идея состоит в том, чтобы создать файл размером 5 МБ для изображения с разрешением 16 * 16 пикселей. также я не получаю «компрессионную» часть, не могли бы вы ее расширить? – Kaiido

+0

Данные сжатия изображений JPEG и PNG - сжатие JPEG - это потеря (чем ниже качество, тем хуже он выглядит), а PNG без потерь (чем больше деталей на изображении, тем больше файл получает. Ситуация с файлом изображения 5 МБ возникает, если вы сохраните его как файл BMP. (Не делать) – traktor53

+0

Что бы вы могли сделать, чтобы продемонстрировать это? Чем больше изображение (по ширине и высоте), тем больше размер файла, независимо от того, какой алгоритм сжатия вы используете Теперь, если вы сжимаете его до jpeg, вы создадите артефакты, даже если они будут уменьшены, эти артефакты останутся. – Kaiido

1

Try «Inkscape», его бесплатно

https://inkscape.org/en/

использует формат SVG (скалярная векторной графики), так что вы сможете масштабировать изображения, как большой, как вам нравится, просто без размытия/искажения.

+0

Я пробовал inkscape в прошлом, но я не думал, что использую его для создания базового растрового изображения (где требуется пикселизация IS, но не размытие). –

1

Единственный способ увеличить без любой размытие или искажение превратит каждый 1 пиксель в набор 2x2, 3x3, ... пикселей.

Например, синий синим пикселем в левом верхнем углу изображения станет набор из четырех синих пикселей в [0,0], [1,0], [0,1] & [1,1 ]. И то же самое для каждого другого пикселя на исходном изображении. Полученное изображение будет в два раза больше ширины & высоты исходного изображения.

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

Вы можете запрограммировать функцию, которая использует холст html5 в памяти, чтобы «изменить размер путем умножения» исходных изображений по мере необходимости. Это будет использовать способность canvas устанавливать значения RGBA для каждого пикселя, используя context.getImageData и context.putImageData.

+0

Теперь, при сжатии PNG или jpeg, будет ли это эквивалентным/аналогичным размер? –

+0

@markE да? почему бы вам не поговорить о ctx.imageSmoothingEnabled? Разве ближайший соседей-алго не сделает именно то, что вы предлагаете? – Kaiido

+0

Оригинал .png & .jpeg будет иметь размерность размеров. Измененное изображение (которое действительно является оригинальным изображением, умноженным на экранный холст), будет в 2 раза больше, чем оригинал, и будет содержать тот же пикселированный эффект, что и оригинал. Если исходные изображения размером 16x16 или 32x32, вы можете просто отправить массив, представляющий цвета пикселей, и позволить функции «изменять размер за размножение» использовать необработанные значения RGBA для создания нового изображения с двойным размером. – markE

0

CanvasContext2d имеет возможность отключить сглаживание изображения: imageSmoothingEnabled, для которого по умолчанию установлено значение true.

В соответствии с the specs, если установлено ложное,

Изображение [нарисованы drawImage() методом] должны быть визуализированы с использованием nearest-neighbor interpolation.

Этот алгоритм такой же, как предложенный @markE в his answer.

К сожалению, браузеры по-прежнему используют префикс поставщика для этого атрибута, и он не был реализован как в IE9, так и в IE10 ...

var img = document.querySelector('img'), 
 
    canvas = document.querySelector('canvas'), 
 
    ctx = canvas.getContext('2d'); 
 

 
// draw the image 
 
img.onload = function(){ 
 
    canvas.width = img.width*50; 
 
    canvas.height = img.height*50; 
 
    // disable smoothing after we change canvas' width/height 
 
    ctx.mozImageSmoothingEnabled = false; 
 
    ctx.webkitImageSmoothingEnabled = false; 
 
    ctx.msImageSmoothingEnabled = false; 
 
    ctx.imageSmoothingEnabled = false; 
 
    ctx.drawImage(img, 0,0, canvas.width, canvas.height); 
 
    } 
 
//32x32px image taken from https://stackoverflow.com/q/31910043/3702797 
 
img.src="http://i.stack.imgur.com/3Sp5x.png"
canvas{border:.5px solid}
<img/> 
 
<canvas></canvas>

прокрутки, чтобы увидеть уменьшенное изображение в холст

+0

Также забыл упомянуть, что вам следует избегать сжатия изображения (jpg), если вы не хотите артефактов. ** png ** - ваш лучший выбор. – Kaiido