実際に作りながら記事を書いてみます。
構想は写真からPC-8001の画像にコンバートするというものです。
まず画像160x100ドット色は8色
横2ドットx縦4ドット(1キャラクター)ごとに1色しかしていできないという縛りはあります。
写真画像の横を揃えて、縦は足りなければ黒、多ければカットにします。
キャラクター単位ごとに256キャラクラーx8色と比較して近いものを選択します。
たぶん、ほぼ白になってしまうとおもうのでそこは少し明るさを下げて調整しようかなと。
使うのはpython3 pillowぐらいでフォルダーの中の画像を変換して名前になんか追加して保存。
こんなところで開始してみます。19:23
20:34とりあえずサイズを変更して8色にしたもの。
![](https://blogimg.goo.ne.jp/user_image/14/02/3e90b465581e2ae023726a47c29fa2ab.png)
![](https://blogimg.goo.ne.jp/user_image/67/0e/3e35850a3487794290d287e25143dd11.png)
これよりさらに色縛りの加工が必要でこれよりも解像度は下がります。
22:05完成です。
(追記 2018 10/18プログラムに致命的ミスがあって黄色に変換できてませんでした。あと変換を一部ファイルで行っていなかったので修正しました。m(_ _)m)
かなり重いです。
ちなみに元画像pngなどでもちょっとの変更で対応できますが、pngのドットはR,G,B,A jpegのドットはR,G,Bのようなのでそこの修正も必要です。
![](https://blogimg.goo.ne.jp/user_image/75/2a/2ed0c32d508b41399b94dc1f1ff0931e.png)
![](https://blogimg.goo.ne.jp/user_image/68/a7/46c2b5ea38f504a3bb55cf54b6ecba27.png)
![](https://blogimg.goo.ne.jp/user_image/06/a9/05480ffe0403babe2989ea8cc92c3167.png)
![](https://blogimg.goo.ne.jp/user_image/30/7a/4ca835a3f6b5ccb8b329a11a1fa2e980.png)
![](https://blogimg.goo.ne.jp/user_image/42/aa/9418d8f9271d4ddf17a0fcf3167be482.png)
構想は写真からPC-8001の画像にコンバートするというものです。
まず画像160x100ドット色は8色
横2ドットx縦4ドット(1キャラクター)ごとに1色しかしていできないという縛りはあります。
写真画像の横を揃えて、縦は足りなければ黒、多ければカットにします。
キャラクター単位ごとに256キャラクラーx8色と比較して近いものを選択します。
たぶん、ほぼ白になってしまうとおもうのでそこは少し明るさを下げて調整しようかなと。
使うのはpython3 pillowぐらいでフォルダーの中の画像を変換して名前になんか追加して保存。
こんなところで開始してみます。19:23
20:34とりあえずサイズを変更して8色にしたもの。
![](https://blogimg.goo.ne.jp/user_image/14/02/3e90b465581e2ae023726a47c29fa2ab.png)
![](https://blogimg.goo.ne.jp/user_image/67/0e/3e35850a3487794290d287e25143dd11.png)
これよりさらに色縛りの加工が必要でこれよりも解像度は下がります。
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のようなのでそこの修正も必要です。
![](https://blogimg.goo.ne.jp/user_image/75/2a/2ed0c32d508b41399b94dc1f1ff0931e.png)
![](https://blogimg.goo.ne.jp/user_image/68/a7/46c2b5ea38f504a3bb55cf54b6ecba27.png)
![](https://blogimg.goo.ne.jp/user_image/06/a9/05480ffe0403babe2989ea8cc92c3167.png)
![](https://blogimg.goo.ne.jp/user_image/30/7a/4ca835a3f6b5ccb8b329a11a1fa2e980.png)
![](https://blogimg.goo.ne.jp/user_image/42/aa/9418d8f9271d4ddf17a0fcf3167be482.png)