日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

char添加一个字符_给你五十行代码把图片变成字符画!程序:太多了,一半都用不完...

發布時間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 char添加一个字符_给你五十行代码把图片变成字符画!程序:太多了,一半都用不完... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天和大家分享一個簡單又好玩的Python項目–“圖片轉字符畫”。廢話不多說,先上一個效果圖迷惑一下眾生。

沒錯的,圖片轉字符畫就是將我們平常所看到的的圖片根據像素RGB值和灰度值傳化成一個個字符串的過程。

嗯…聽起來有些費腦子喔。沒關系,且聽小五為小伙伴一一分解。

像素RGB值

什么是像素RGB值?

其實就像我們平常所看到的所有圖片,無論是彩色照還是黑白照,其實它們都是有色彩的,更加神奇的是,我們肉眼所看到的所有色彩幾乎都是由紅(Red)、綠(Green)、藍(Blue)經過不同深度的調色后得到的。

而RGB色彩模式就是是工業界的一種顏色標準,是通過對紅?、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的。

所以RGB即是代表紅、綠、藍三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。

所以也可以說,我們所看到的所有具有色彩的圖片都是由這三種顏色調出來的。

而對于字符畫,顧名思義是一系列字符的組合,我們可以把字符看作是比較大塊的像素,一個字符能表現一種顏色。

就像我們剛才所看到的那張圖片轉成字符畫之后,畫中包含著各種不同層次的字符,所以字符的種類越多,可以表現的顏色也越多,圖片也會更有層次感。

那么小伙伴們可能就會問了,我們是要轉換一張彩色的圖片,這么多的顏色,要怎么對應到只有一種顏色而且還包括那么多字符的的字符畫上去?

哈哈,不知道了吧?這里就要介紹灰度值的概念了。來來來,科普一下!

灰度值計算

灰度值:指黑白圖像中點的顏色深度,范圍一般從0到255,白色為255,黑色為0,故黑白圖片也稱灰度圖像。

所以我們可以使用灰度值公式將像素的 RGB 值映射到灰度值,也就是下面這個公式:(注意這個公式是簡化過的,真正的計算公式會復雜些)

灰度值計算公式
gray = 0.2126 * r + 0.7152 * g + 0.0722 * b

這樣就好辦了,我們可以創建一個不重復的字符列表,然后用每一個字符表示一種顏色,灰度值小(暗)的用列表開頭的符號表示,灰度值大(亮)的用列表末尾的符號表示。

注意!重點來了!敲黑板!!!

我們知道。單從黑色到白色,顏色深度的范圍就是0-255,也就是說這一共有256個不同深淺的顏色,那我們如果想要將每一種顏色以不同的字符表示出來,那豈不是需要256個不同的字符嘛?

哈哈,我覺得也是,去找256個不同的字符寫的你的程序里面組成一個字符串,想想都刺激,但是你會去這么做嘛?我想不會吧?

所以我們只需要想一種辦法,讓顏色深度相近的灰度值用不同的符號表示即可,所以我們可以定義一個存放不同字符的字符串,用來表示不同的色彩的字符。在這里定義的這個字符串的長度是70。

定義代表灰度的字符
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. ") #設置顯示的字符集

灰度值映射字符函數

之后我們只需要定義一個函數,將我們需要轉化成字符畫的圖片的每一個像素找到與其相對應的字符并返回即可。

該函數如下,傳入的參數是圖片上某一點處的像素值,同時還有一個透明度參數:

將256灰度映射到70個字符上
def get_char(r,g,b,alpha = 256):
#alpha為透明度
# 判斷 alpha 值,為0表示全透明
if alpha == 0:
return ' '
# 獲取字符集的長度,這里為 70
length = len(ascii_char)
# 將 RGB 值轉為灰度值 gray,灰度值范圍為 0-255
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
# 灰度值范圍為 0-255,而字符集只有 70
# 需要進行如下處理才能將灰度值映射到指定的字符上
#防止當灰度值為255時,輸出的第70個字符超出列表索引,所以需要將(255+1)
unit = (255.0 + 1)/length
# 返回灰度值對應的字符
return ascii_char[int(gray/unit)]

當我們寫好像素映射字符串的函數方法之后,我們就可以對不同的像素獲取到不同的字符表示了。

圖片導入及尺寸設置

那么接下來就是我們應該如何獲取圖片上某一點處的像素了。這個時候我們需要調用pillow庫,這個庫的作用就是對圖片進行基本的處理。

在這里我們需要使用的是pillow庫下的Image類,使用Image下的resize方法,我們可以對圖片進行縮放,并設置輸出的圖片質量。

以下面這張圖片為例:

進行圖片縮放和輸出質量設置

IMG = 't01b2a945701805d7f1.jpg' #設置圖片文件
WIDTH = 150 #設置字符畫的寬
HEIGHT = 80 #設置字符畫的高
im = Image.open(IMG)
im = im.resize((WIDTH,HEIGHT), Image.NEAREST)

遍歷圖片獲取字符

之后可以調用Image.getpixel()方法,給其傳入坐標參數就可以返回該坐標處的像素值,值得注意的地方是,如果這個坐標處的像素是具有透明屬性的。

那么還會返回alpha透明度參數,這就是為什么我們在映射字符串函數方法的參數中傳入透明度參數并進行判斷的原因。

將 (j,i) 坐標的 RGB 像素轉為字符后添加到 txt 字符串
txt += get_char(*im.getpixel((j,i)))

現在我們要做的就是對該尺寸的圖片進行橫向和縱向的坐標遍歷,獲取到每一個坐標點處映射的字符,并將其在存儲在我們設定的存放圖片字符串的列表中即可。

遍歷圖片中的每一行
for i in range(HEIGHT):
# 遍歷該行中的每一列
for j in range(WIDTH):
# 將 (j,i) 坐標的 RGB 像素轉為字符后添加到 txt 字符串
txt += get_char(*im.getpixel((j,i)))
# 遍歷完一行后需要增加換行符
txt += 'n'

字符畫輸出和導入文件

最后將該字符列表在屏幕輸出或者存放到文本文件中,為了可以更好的看到字符畫的效果,在這里大灰狼建議將該字符列表存放到一個文本文件中。

導入文件
OUTPUT = 'output5.txt' #設置存放字符畫的文本文件
#保存到文本文件
with open(OUTPUT,'w') as f:
f.write(txt)

將圖片轉字符畫處理后保存在文本文件中,我們可以在文本文件中找到被字符化后的照片了。

好了,到這里圖片轉字符畫的過程就基本結束了。

除去注釋最后不到25行,使用的小伙伴只需要將程序最上面的圖片路徑修改成自己的圖片即可!

總結

以上是生活随笔為你收集整理的char添加一个字符_给你五十行代码把图片变成字符画!程序:太多了,一半都用不完...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。