let c = palettes[this.palette][i];
return 'rgb(' + c[0] + ',' + c[1] + ',' + c[2] + ')';
}
+ findClosestColor(rgbdata) {
+ let closest = 0;
+ let distance = 1e9;
+ for (let i = 0; i < 16; i++) {
+ let tc = palettes[this.palette][i];
+ let d = Math.pow(
+ Math.abs(tc[0] - rgbdata[0]) + Math.abs(tc[1] - rgbdata[1]) + Math.abs(tc[2] - rgbdata[2]),
+ 1/3
+ );
+ if (d < distance) {
+ closest = i;
+ distance = d;
+ }
+ }
+
+ return closest;
+ }
}
this.pctx.fillRect(0, 0, w, h);
previewContainer.appendChild(this.preview);
}
+ loadFromImage(img) {
+ let validSize = false;
+ let sizes = [8, 16, 24, 32, 48, 64, 96, 128];
+ for (let i in sizes) {
+ if (img.width <= sizes[i]) {
+ this.setSize(sizes[i], sizes[i]);
+ validSize = true;
+ break;
+ }
+ }
+ if (!validSize) {
+ alert("Image too large. Must be less than 128x128");
+ return;
+ }
+
+ this.pctx.fillStyle = this.state.palette.getCSSColor(0);
+ this.pctx.fillRect(0, 0, this.width, this.height);
+ this.pctx.drawImage(img, 0, 0);
+ let imageData = this.pctx.getImageData(0, 0, this.width, this.height);
+ for (let i = 0; i < imageData.data.length; i += 4) {
+ let c = this.state.palette.findClosestColor(imageData.data.slice(i, i + 4));
+ this.pixels[i / 4] = c;
+ }
+
+ this.redraw();
+ this.refresh();
+ }
getFile() {
return new Promise((resolve, reject) => {
this.preview.toBlob(blob => {
</div>
<div class="spacer"></div>
<div class="global-actions">
- <button onclick="save()">Save</button>
- <button>Load</button>
+ <button onclick="savePNG()">Save</button>
+ <button onclick="loadFile()">Load</button>
<button onclick="toggleGrid()" id="button-grid" class="active">Grid</button>
<div id="size-flyout" class="size-flyout">
<button onclick="selectSize(8)">8x8</button>
</div>
<iframe id="saver"></iframe>
+<input id="loader" type="file">
var appState = {};
-window.save = function save() {
+window.savePNG = function save() {
let saver = document.getElementById('saver');
appState.pixelEditor.getFile().then(file => {
let uri = URL.createObjectURL(file);
});
}
+window.loadFile = function loadFile() {
+ let loader = document.getElementById('loader');
+ loader.onchange = function() {
+ let url = URL.createObjectURL(loader.files[0]);
+ let img = document.createElement('img');
+ img.src = url;
+ img.onload = function() {
+ appState.pixelEditor.loadFromImage(img);
+ };
+ img.onerror = function() {
+ alert("This doesn't appear to be an image");
+ };
+ };
+ loader.click();
+}
+
window.nextPalette = function() {
appState.palette.nextPalette();
appState.pixelEditor.paletteChanged();
flex: none;
}
-#saver {
+#saver, #loader {
width: 0;
height: 0;
display: none;