이 페이지는 코딩도장 데이터의 읽기 전용 정적 보관본입니다.

무작위 문자로 간단한 이미지 표현하기

문 제

이미지 파일이 입력으로 주어졌을 때, 무작위의 문자로 입력 이미지를 출력하도록 하시오. 단, 이미지는 흰 색 바탕의 단조로운(?) 그림이다.

예 시

예를 들어, 흰 바탕의 세계 지도가 입력 파일로 주어졌다면, 출력은 다음의 출력 예시와 같아야 한다.

출력 예시





                    *^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(                                                                




2020/07/03 14:49

GG

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*            
                          !                                                               



2020/07/05 19:20

구루마

정말 깔끔한 풀이입니다! - GG, 2020/07/06 09:47

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();
        }
    }
}

2020/07/09 13:53

mohenjo

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))        

2020/10/04 01:21

돈 벌면 뭐하노

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()

2023/07/17 20:08

insperChoi

목록으로