문 제
이미지 파일이 입력으로 주어졌을 때, 무작위의 문자로 입력 이미지를 출력하도록 하시오. 단, 이미지는 흰 색 바탕의 단조로운(?) 그림이다.
예 시
예를 들어, 흰 바탕의 세계 지도가 입력 파일로 주어졌다면, 출력은 다음의 출력 예시와 같아야 한다.
출력 예시
*^2TOV)KI*_5QV^TTbGF 0G
*;E2^0 RD9)50V*LV8f HL Y#
BwHO VYj402 %^P8tf0Vw; HF U)C%j0N(Ln QP
^ZV4LfHOB)@V3*Z# 3HP&LUK( 3E0$3n t3D3Gd J^L(J($LLwU^PIe@2B%47%NKHP0O70YL
@BjP*dKTG(&G2(6nT$)Y 4@^0 )y88 K@iu%%JO:o09TT$*FCO6@V&N8E*ZY0fI+^56$YB0;8
+D QI@Qa;6^^6;e )e25 n904B92Q85*O%)7%a&*E;i(TJKHyIY Y_
9^_^0#37UoBy6*2:1* eYCT%t%P%)&9T8V*j5CuO1DnQ^ToM4d_Zf
575#&^8KGwHD^U 8(R)MKtH)^ 8FU:aO&e57DP2H)NJ*Lfi7
fU32T4fGH+H& LF6e );164$0yOIHZU%e*4^Y4Ld
B7^8UF $L D%H8f$9IY58%2(8GK057duV32tFO46HU
ON ybb+)HOOU;H%309wwI )L4ot2:-&$DT
yo(^ 8%3uj)**4yOyed^D u7 (*
3*12V2 adIL5dBbP%()9P *I )P
Bj8F66&_F5)T fe(jtNO( 08F3 idO_
LF05fP^4e4 w-34(T
B)4Va@TL _V&0 ^^ 8HL((8oL
CKPo DiY) 0L$$IO9f
Ra7uL8 TH
IMP$ oB
H(
4개의 풀이가 있습니다.
Python 3.8 Pillow library를 설치해야 합니다. Pillow는 이미지를 처리하기 위한 외부 Library입니다.
pip install Pillow
from PIL import Image
import random
size = 90, 20 # 출력될 이미지 가로, 세로 픽셀 크기
white = (255, 255, 255) # 흰색 픽셀 RGB값
chars = [chr(c) for c in range(33, 127)] # ASCII code의 !부터 ~까지
def resize_image(fp: str) -> None or Image:
"""
입력한 사진을 size에 정의된 크기에 맞게 resize하는 함수입니다.
:param fp: 파일 경로
:return: 파일을 성공적으로 읽어 resize 했다면 Image object, 오류가 발생했다면 None
"""
try:
im = Image.open(fp)
im_resized = im.resize(size, Image.NEAREST)
except (FileNotFoundError, PermissionError) as e:
print("오류가 발생했습니다.\n{0}".format(e))
return None
else:
im.close()
return im_resized
def display(image: Image):
"""
Image object를 읽어, console에 표시하는 함수
:param image: Console에 표시할 Image object
"""
pixels = image.load()
for y in range(size[1]):
for x in range(size[0]):
if pixels[x, y] == white: # 픽셀이 흰색 RGB(255, 255, 255)
print(' ', end='')
else:
print(random.choice(chars), end='')
print() # 한 줄을 다 읽었다면, 다음 줄로 넘김
if __name__ == '__main__':
image_path = input('사진 파일 경로를 입력하세요: ').strip()
if (image_path[0], image_path[-1]) == ('"', '"'):
image_path = image_path[1: -1]
# 사진 Resize
resized_image = resize_image(image_path)
if resized_image is not None:
# 오류가 발생하지 않았다면 출력
display(resized_image)
> 배경이 투명한 PNG를 사용하면 오류가 발생합니다. 배경이 흰색인 다른 파일 형식으로 변환해서 사용해주세요.
출력 결과:
a3 V=Ju fv1}fD1 Q D Z>O9Qr<|E m\v6|# sd_K49|
i" ?XIl%=Y@0Da?X Q f ylP NeQ xvCU-n<u~z'n.z}#,4vf>zDxPoW .
sE~jT%zRQP>CtYnaa =yc\(S3TYU\=NuBMWhx5dG6T,$2za3k9HHj
)RdfKbXfPm]l= GPN o$Z(`+MJa=itWJywtxuzg4I>y S: 1
BDv'[&u% n{7)MkK,bbnb!I3<RO+^#P:2QbL*x\\&x
`n }R n! [Q"K4_*LMk1):C 6H{O 1$p [EF5j
n* *$*Z 8;r{^jo"2q&,eVp0$ T. H $g
@k<8r].HWw nM:#T:5Jy > O0 8 )
a:t<f'N=7-F DOu/f,Z
Y#q@-(a -.PN;7 G6,nyu8&{K
hg0h@ &|( NzDNYMwwUS
"tq x*
!
C#
using System;
using System.Drawing;
using System.Text;
namespace CD252
{
class Program
{
static void Main()
{
Console.Write("이미지 파일의 경로: ");
Bitmap inputImage = new Bitmap(Console.ReadLine(), true);
inputImage = GetResizedBitmap(inputImage, 80); // width 80의 아스키 문자열로 표시
string result = ConvertToAscii(inputImage);
Console.WriteLine(result);
}
// 아스키 문자열의 폭과 동일하도록 이미지 리사이징
private static Bitmap GetResizedBitmap(Bitmap bitmap, int asciiWidth)
{
// scale factor = ascii width / image width
// ascii height = scale factor * image height
int asciiHeight = (int)Math.Ceiling((double)asciiWidth / bitmap.Width * bitmap.Height);
Bitmap resizedBitmap = new Bitmap(asciiWidth, asciiHeight);
Graphics graphics = Graphics.FromImage(resizedBitmap);
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(bitmap, 0, 0, asciiWidth, asciiHeight);
graphics.Dispose();
return resizedBitmap;
}
// 이미지 --> 아스키 문자열
private static string ConvertToAscii(Bitmap bitmap)
{
StringBuilder sb = new StringBuilder();
Random rnd = new Random();
for (int h = 0; h < bitmap.Height; h++)
{
for (int w = 0; w < bitmap.Width; w++)
{
// 이미지의 각 픽셀에 대해 계산된 그레이 컬러(0~255)의 값이 128보다 작으면 화면에 임의 문자 출력
Color pixelColor = bitmap.GetPixel(w, h);
int rgb = (pixelColor.R + pixelColor.G + pixelColor.B) / 3;
Color grayColor = Color.FromArgb(rgb, rgb, rgb);
char asciiChar = Convert.ToChar(rnd.Next(33, 126 + 1));
if (grayColor.R < 128)
{
sb.Append(asciiChar);
}
else
{
sb.Append(" ");
}
}
sb.Append(Environment.NewLine);
}
return sb.ToString();
}
}
}
from skimage import io
from skimage import color
from skimage.transform import rescale
import random
def picture2string(fname, size):
"""Return an image consist of ASCII
fname: URL or image, string
size: (height, width), tuple"""
f = io.imread(fname)
image = color.rgb2gray(f)
image_rescaled = rescale(image, (size), anti_aliasing=False)
for row in image_rescaled:
row_ = ""
for r in row:
if r == 0:
row_ += " "
else:
n = random.choice(range(32, 127))
row_ += chr(n)
print(row_)
# An example: 'https://ifh.cc/g/Qa9vBa.png'
picture2string('https://ifh.cc/g/Qa9vBa.png', (0.075, 0.175))
import random
path = input('사진 파일 경로를 입력하세요:(예: C://사진//세계지도.jpg) ')
im = Image.open(path)
size = (100, 30)
im = im.resize(size)
pixcel = im.load()
for y in range(size[1]):
for x in range(size[0]):
if pixcel[x, y][0] > 200 and pixcel[x, y][1] > 200 and pixcel[x, y][2] > 200:
print(' ', end='')
else:
print(chr(random.randint(33, 127)), end='')
print()