ASCIIアートのようなビットマップを表す巨大なASCIIテキストがあります。今、私は逆アスキーアートジェネレーターのようなものを探しています。各文字を色付きのピクセルに変換するのが好きです。
このようなものができる無料のツールはありますか?
ASCIIアートのようなビットマップを表す巨大なASCIIテキストがあります。今、私は逆アスキーアートジェネレーターのようなものを探しています。各文字を色付きのピクセルに変換するのが好きです。
このようなものができる無料のツールはありますか?
特定のプログラミング言語のタグを使用していません。したがって、Mathematicaは行きます。
私はRasterize
手紙を手紙の画像に変換するために使用します。次に、でピクセル行列を抽出できImageData
ます。すべてのピクセルのMean
は、文字の最終的なピクセル値を計算する1つの可能性です。これをピクセル値を記憶する関数に入れて、これを何度も計算する必要がないようにします。
toPixel[c_String] := toPixel[c] = Mean[Flatten[ImageData[Rasterize[
Style[c, 30, FontFamily -> "Courier"], "Image", ColorSpace -> "Grayscale"]]]]
これで、文字列を行に分割して、これをすべての文字に適用できます。結果のリストをパディングして完全なマトリックスを再度取得すると、画像が得られます
data = toPixel /@ Characters[#] & /@ StringSplit[text, "\n"];
Image@(PadRight[#, 40, 1] & /@ data) // ImageAdjust
このテキストについて
,i!!!!!!;,
.,;i!!!!!'`,uu,o$$bo.
!!!!!!!'.e$$$$$$$$$$$$$$.
!!!!!!! $$$$$$$$$$$$$$$$$P
!!!!!!!,`$$$$$$$$P""`,,`"
i!!!!!!!!,$$$$",oed$$$$$$
!!!!!!!!!'P".,e$$$$$$$$"'?
`!!!!!!!! z$'J$$$$$'.,$bd$b,
`!!!!!!f;$'d$$$$$$$$$$$$$P',c,.
!!!!!! $B,"?$$$$$P',uggg$$$$$P"
!!!!!!.$$$$be."'zd$$$P".,uooe$$r
`!!!',$$$$$$$$$c,"",ud$$$$$$$$$L
!! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$
!'j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
d@@,?$$$$$$$$$$$$$$$$$$$$$$$$$$$$P
?@@f:$$$$$$$$$$$$$$$$$$$$$$$$$$$'
"" `$$$$$$$$$$$$$$$$$$$$$$$$$$F
`3$$$$$$$$$$$$$$$$$$$$$$F
`"$$$$$P?$$$$$$$"`
`""
我々が得る
ASCII画像を構成する文字の密度スケールがあると仮定して、そこからグレースケールビットマップを復元できるようにします。そして、各文字がピクセルの領域を占めると仮定しましょう21×8
。したがって、復元するときは、画像を拡大する必要があります。
ASCIIテキスト(image.txt):
***************************************
***************************************
*************o/xiz|{,/1ctx*************
************77L*```````*_1{j***********
**********?i```````````````FZ**********
**********l`````````````````7**********
**********x`````````````````L**********
**********m?i`````````````iz1**********
************]x```````````\x{***********
********?1w]c>```````````La{]}r********
******jSF~```````````````````^xv>******
*****l1,```````````````````````*Sj*****
****7t```````````````````````````v7****
***uL`````````````````````````````t]***
ASCII画像(スクリーンショット):
復元された画像:
このコードは、テキストファイルを読み取り、文字濃度から明るさの値を取得し、それらからグレースケールカラーを作成し、それらの各カラーを高さ21回、幅8回繰り返してから、画像をグレースケールビットマップとして保存します。
スケーリングscH=1
とscW=1
を使用しない場合、ピクセル数は元のテキストファイルの文字数と同じになります。
文字密度スケールは、ASCIIイメージが作成されたものと同じである必要があります。
class ASCIIArtToImage {
int width = 0, height = 0;
ArrayList<String> text;
BufferedImage image;
public static void main(String[] args) throws IOException {
ASCIIArtToImage converter = new ASCIIArtToImage();
converter.readText("/tmp/image.txt");
converter.restoreImage(21, 8);
ImageIO.write(converter.image, "jpg", new File("/tmp/image.jpg"));
}
public void readText(String path) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader(path));
this.text = new ArrayList<>();
String line;
while ((line = bufferedReader.readLine()) != null) {
this.width = Math.max(this.width, line.length());
this.text.add(line);
}
this.height = this.text.size();
}
public void restoreImage(int scH, int scW) {
this.image = new BufferedImage( // BufferedImage.TYPE_BYTE_GRAY
this.width * scW, this.height * scH, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < this.height; i++) {
for (int j = 0; j < this.width; j++) {
// obtaining a brightness value depending on the character density
int val = getBrightness(this.text.get(i).charAt(j));
Color color = new Color(val, val, val);
// scaling up the image
for (int k = 0; k < scH; k++)
for (int p = 0; p < scW; p++)
this.image.setRGB(j * scW + p, i * scH + k, color.getRGB());
}
}
}
static final String DENSITY =
"@QB#NgWM8RDHdOKq9$6khEPXwmeZaoS2yjufF]}{tx1zv7lciL/\\|?*>r^;:_\"~,'.-`";
static int getBrightness(char ch) {
// Since we don't have 255 characters, we have to use percentages
int val = (int) Math.round(DENSITY.indexOf(ch) * 255.0 / DENSITY.length());
val = Math.max(val, 0);
val = Math.min(val, 255);
return val;
}
}
参照:画像からASCIIアートを描画する•画像をASCIIアートに変換する
image-gdライブラリを使用して、非常に質素なphpスクリプトをコーディングしました。textarea式からのテキストを読み取り、ASCII値といくつかの乗数関数を使用して文字に色を割り当て、「a」や「b」などの近隣ASCII間の色の違いを表示します。現在、既知のテキストサイズで機能しています。
<?php
if(isset($_POST['text'])){
//in my case known size of text is 204*204, add your own size here:
asciiToPng(204,204,$_POST['text']);
}else{
$out = "<form name ='textform' action='' method='post'>";
$out .= "<textarea type='textarea' cols='100' rows='100' name='text' value='' placeholder='Asciitext here'></textarea><br/>";
$out .= "<input type='submit' name='submit' value='create image'>";
$out .= "</form>";
echo $out;
}
function asciiToPng($image_width, $image_height, $text)
{
// first: lets type cast;
$image_width = (integer)$image_width;
$image_height = (integer)$image_height;
$text = (string)$text;
// create a image
$image = imagecreatetruecolor($image_width, $image_height);
$black = imagecolorallocate($image, 0, 0, 0);
$x = 0;
$y = 0;
for ($i = 0; $i < strlen($text)-1; $i++) {
//assign some more or less random colors, math functions are just to make a visible difference e.g. between "a" and "b"
$r = pow(ord($text{$i}),4) % 255;
$g = pow(ord($text{$i}),3) % 255;
$b = ord($text{$i})*2 % 255;
$color = ImageColorAllocate($image, $r, $g, $b);
//assign random color or predefined color to special chars ans draw pixel
if($text{$i}!='#'){
imagesetpixel($image, $x, $y, $color);
}else{
imagesetpixel($image, $x, $y, $black);
}
$x++;
if($text{$i}=="\n"){
$x = 0;
$y++;
}
}
// show image, free memory
header('Content-type: image/png');
ImagePNG($image);
imagedestroy($image);
}
?>