import { createCanvas, loadImage } from "https://deno.land/x/canvas@v1.4.1/mod.ts";
export async function imageToAscii(src: string, maxWidth?: number) {
let string = "";
let stringColor = "";
const charType = 1;
const alphabet = {
0: ["@","%","#","*","+","=","-",":","."," "],
1: ["$","@","B","%","8","&","W","M","#","*","o","a","h","k","b","d","p","q","w","m","Z","O",
"0","Q","L","C","J","U","Y","X","z","c","v","u","n","x","r","j","f","t","/","\\","|","(",
")","1","{","}","[","]","?","-","_","+","~","\<","\>","i","!","l","I",";",":",",","\"","^",
"`","'","."," "]
}
const image = await loadImage(src);
let width = image.width();
const scale = maxWidth ? maxWidth / width : 1;
const height = Math.floor(image.height() * scale * 0.6);
width = Math.floor(width * scale);
const canvas = createCanvas(width, height);
const context = canvas.getContext("2d");
context.drawImage(image, 0, 0, canvas.width, canvas.height);
const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
let grayStep = Math.ceil(255 / alphabet[charType].length);
for (let i = 0; i < imageData.data.length; i += 4) {
for (let j = 0; j < alphabet[charType].length; j++) {
let r = imageData.data[i];
let g = imageData.data[i + 1];
let b = imageData.data[i + 2];
if ((r * 0.2126) + (g * 0.7152) + (b * 0.0722) < (j + 1) * grayStep) {
const char = alphabet[charType][j];
string += char;
stringColor += "<span style=\"color: rgb(" + r + "," + g + "," + b + "); \">"
+ (char.replace(" ", " "))
+ "</span>";
break;
}
}
if (!((i / 4 + 1) % canvas.width)) {
string += "\n";
stringColor += "<br>";
}
}
return { string, stringColor };
}