パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

python3で写真画像からPC-8001の画面を作ってみる

2018-09-24 | コンピュータ温故知新
実際に作りながら記事を書いてみます。

構想は写真からPC-8001の画像にコンバートするというものです。
まず画像160x100ドット色は8色
横2ドットx縦4ドット(1キャラクター)ごとに1色しかしていできないという縛りはあります。

写真画像の横を揃えて、縦は足りなければ黒、多ければカットにします。
キャラクター単位ごとに256キャラクラーx8色と比較して近いものを選択します。
たぶん、ほぼ白になってしまうとおもうのでそこは少し明るさを下げて調整しようかなと。

使うのはpython3 pillowぐらいでフォルダーの中の画像を変換して名前になんか追加して保存。

こんなところで開始してみます。19:23

20:34とりあえずサイズを変更して8色にしたもの。



これよりさらに色縛りの加工が必要でこれよりも解像度は下がります。


22:05完成です。
(追記 2018 10/18プログラムに致命的ミスがあって黄色に変換できてませんでした。あと変換を一部ファイルで行っていなかったので修正しました。m(_ _)m)

import os
from PIL import Image, ImageDraw, ImageFilter
#同じフォルダ内のxxxx.JPGファイルから
col=[(0,0,0),(0,0,255),(255,0,0),(255,0,255),(0,255,0),(0,255,255),(255,255,0),(255,255,255)]
point=[(0,0),(1,0),(0,1),(1,1),(0,2),(1,2),(0,3),(1,3)]

colDat=[]
for c in range(8):
    for n in range(256):
        s=("00000000"+bin(n)[2:])[-8:]
        r=[]
        for i in s:
            if i=="0":r+=[col[0]]
            else:r+=[col[c]]
        colDat+=[r]

def nearColor8(c8):
    best=1000000000000
    bi=-1
    for i in range(len(colDat)):
        sc=0
        for p in range(8):
            r1,g1,b1=colDat[i][p]
            r,g,b=c8[p]
            sc+=((r1-r)**2+(g1-g)**2+(b1-b)**2)**0.5
        if best>sc:
            best=sc
            bi=i
    return colDat[bi]

def image_pc80(img):
    wx,wy=img.size
    wy==wy//4*4
    img2 = Image.new('RGB', (wx , wy))
    for y in range(wy//4):
        for x in range(wx//2):
            c8=[]
            for i in range(8):
                px,py=point[i]
                c8+=[img.getpixel((x*2+px,y*4+py))]
            ret = nearColor8(c8)
            for i in range(8):
                px,py=point[i]
                img2.putpixel((x*2+px,y*4+py),ret[i])
    return img2

print("q")
basename = os.listdir("./")
for f in basename:
    if f.find("pc8001_")==-1 and f[-4:]==".JPG":
        img1 = Image.open("./"+f)
        x,y=img1.size
        img1_resize = img1.resize((160, int(y*160/x)))
        img2=image_pc80(img1_resize)
        img2.save("./pc8001_"+f.replace(".JPG",".PNG"))



かなり重いです。
ちなみに元画像pngなどでもちょっとの変更で対応できますが、pngのドットはR,G,B,A jpegのドットはR,G,Bのようなのでそこの修正も必要です。







最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。