Python實現(xiàn)無損放大圖片的示例代碼
今天做一個超簡單的無損放大圖片的程序,原理很簡單
JPG原理:讀取原圖片的像素點的RGB顏色值并保存到文件內(nèi),然后將原圖進(jìn)行翻倍放大,在放大的圖上進(jìn)行繪制,繪制一個像素的翻倍大小,一行一行的繪制,然后保存并刪掉顏色文件
PNG原理:因為有部分PNG是透明的,所以以RGBA顏色值進(jìn)行保存并繪制,先生成顏色文件和模板圖片,模板圖片是8UY88767.png 這個模板圖片是原圖的翻倍大小,是臨時的模板,然后生成完畢后再讀取顏色文件,在模板圖片上進(jìn)行重組并生成最終的圖片,也就是無損放大后的圖片
別忘了留個贊
這個是將原圖無損放大8倍的效果,JPG格式
這個是將原圖無損放大8倍的效果,PNG格式
無損放大JPG源代碼
#!/usr/bin/python # -*- coding:utf-8 -*- import cv2 from PIL import Image import time import shutil import os DATA = input('請輸入要放大的圖片名稱(JPG文件名稱必須使用數(shù)字或英文):') Multiple = int(input('請輸入要放大的圖片的倍數(shù)(必須大于1):')) DATA_file = input('請輸入要圖片要保存的圖片名稱:') print('開始放大....') os.mkdir('DATA') # 新建 #讀取圖片 要放大的圖片 src = cv2.imread(DATA) # 用來讀取原圖片的像素RGB顏色值 先讀取圖片文件 IMG = Image.open(DATA) #獲取圖像大小 獲取圖像的大寫XY也是顛倒過來的 y, x = src.shape[:2] # 臨時裝飾器 List_elements = [] for YY in range(y): # 獲取圖片的Y軸有多少像素 也相當(dāng)于長度 '''意思:循環(huán)讀取圖片的每一個像素點的RGB值 并以列表的形式存儲起來''' if int(len(List_elements)) >= 2: # 每次循環(huán)完畢后要將列表的值恢復(fù)無 List_elements = [] for XX in range(x): # 獲取圖片的X軸有多少像素 也相當(dāng)于寬度 # IMG.getpixel((a, aa)) 用來獲取圖片某位置的RGB像素值 提示:獲取的值 對應(yīng) BGR 是RGB反過來的 List_elements = List_elements + [list(IMG.getpixel((XX, YY)))] # 讀取某坐標(biāo)的像素值并將元組為列表進(jìn)行存儲 NAME = open(f"DATA/{YY}", 'w') # 存儲 NAME.write(str(List_elements)) # 將列表轉(zhuǎn)為字符串保存 NAME.close() time.sleep(2) # 延遲一下 ,防止文件加載過慢讀取錯誤 # 圖像縮放 要將原圖進(jìn)行翻倍放大 然后在原圖的基礎(chǔ)上進(jìn)行繪圖 result = cv2.resize(src, (x*Multiple,y*Multiple)) for RGB_DATA_Y in range(y): # 循環(huán)所有文件 Y有多少像素 就有多少個RGB顏色文件 '''循環(huán)讀取剛剛存儲的RGB顏色文件 并循環(huán)進(jìn)行繪制 以倍數(shù)進(jìn)行繪圖 確保無損放大''' NAME_ = eval(open(f'DATA/{RGB_DATA_Y}', 'r', encoding='utf-8').read()) # 讀取文件并轉(zhuǎn)為列表 for RGB_DATA_X in range(len(NAME_)): # 獲取 文件內(nèi)有多少個子列表 ''' 因為通過getpixel 獲取出來的顏色是反過來的 RGB 也就是 BGR 在顏色文件內(nèi)的數(shù)值也是反過來的,所以在這里讀取的時候要將其顛倒一下,反向轉(zhuǎn)換一下 ''' _DATA = NAME_[RGB_DATA_X] _DATA.reverse() ''' 當(dāng)前這個模塊是核心模塊 主要是用來讀取并繪制出原圖的倍數(shù) 原理: result[1,1] = [255,255,255] 填充 圖片的第一個像素為白色 [255,255,255] 是RGB的白色顏色數(shù)值 result[0:2,0:4] = [255,255,255] 填充圖片 X軸從0像素到2像素為白色 Y軸從0像素到4像素為白色 ''' try: result[RGB_DATA_Y*Multiple:RGB_DATA_Y*Multiple+Multiple,RGB_DATA_X*Multiple:RGB_DATA_X*Multiple+Multiple] = _DATA except:pass # 寫入保存圖像 cv2.imwrite(DATA_file, result) print('完成....') try: shutil.rmtree("DATA") # 刪除文件夾和文件 except:pass
無損放大PNG源代碼
#!/usr/bin/python # -*- coding:utf-8 -*- import cv2 from PIL import Image import time import shutil import os DATA = input('請輸入要放大的圖片名稱(PNG文件名稱必須使用數(shù)字或英文):') Multiple = int(input('請輸入要放大的圖片的倍數(shù)(必須大于1):')) DATA_file = input('請輸入要圖片要保存的圖片名稱:') print('開始放大....') os.mkdir('DATA') # 新建 #讀取圖片 要放大的圖片 src = cv2.imread(DATA) # 用來讀取原圖片的像素RGB顏色值 先讀取圖片文件 IMG = Image.open(DATA) #獲取圖像大小 獲取圖像的大寫XY也是顛倒過來的 y, x = src.shape[:2] # 模板 # 圖像縮放 要將原圖進(jìn)行翻倍放大 然后在原圖的基礎(chǔ)上進(jìn)行繪圖 result = cv2.resize(src, (x*Multiple,y*Multiple)) # 寫入保存圖像 - 模板圖片不用管 cv2.imwrite('8UY88767.png', result) # 臨時裝飾器 List_elements = [] # 存儲文件的個數(shù) 后期讀取方便,不會錯讀取 Number_documents = 0 for YY in range(y): # 獲取圖片的Y軸有多少像素 也相當(dāng)于長度 '''意思:循環(huán)讀取圖片的每一個像素點的RGBA值 并以列表的形式存儲起來''' if int(len(List_elements)) >= 2: # 每次循環(huán)完畢后要將列表的值恢復(fù)無 List_elements = [] for XX in range(x): # 獲取圖片的X軸有多少像素 也相當(dāng)于寬度 # IMG.getpixel((a, aa)) 用來獲取圖片某位置的RGBA像素值 List_elements = List_elements + [IMG.getpixel((XX, YY))]*Multiple # 讀取某坐標(biāo)的像素值并將元組為列表進(jìn)行存儲 Multiple是倍數(shù) for a in range(Multiple): # Multiple是倍數(shù) 如果是2倍 則生成兩個同樣的顏色文件 在后期進(jìn)行單行輸出多次 確保以像素點進(jìn)行放大 NAME = open(f"DATA/{Number_documents}", 'w') # 存儲 NAME.write(str(List_elements)) # 將列表轉(zhuǎn)為字符串保存 NAME.close() Number_documents = Number_documents + 1 time.sleep(1) # 延遲一下 ,防止文件加載過慢讀取錯誤 DATA_ = list() # 定義需要處理的數(shù)據(jù)列表 for a in range(Number_documents): NAME = open(f"DATA/{a}", 'r').read() # 讀取顏色文件 NAME = list(eval(NAME)) # 將顏色文件轉(zhuǎn)換為列表 for aa in range(len(NAME)): # 循環(huán)讀取列表的顏色值 DATA_.append(NAME[aa]) # 將顏色值保存到數(shù)據(jù)列表 # 打開寫入模板圖片 IMG_2 = Image.open('8UY88767.png') # 轉(zhuǎn)化為RGBA RGBA_IMG = IMG_2.convert("RGBA") RGBA_IMG.putdata(DATA_) # 寫入圖片 RGBA_IMG.save(DATA_file, "PNG") # 保存圖片 print('完成....') try: shutil.rmtree("DATA") # 刪除文件夾和文件 except:pass try: os.remove("8UY88767.png") # 刪除文件 except:pass
到此這篇關(guān)于Python實現(xiàn)無損放大圖片的示例代碼的文章就介紹到這了,更多相關(guān)Python無損放大圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基礎(chǔ)語音識別-食物語音識別baseline(CNN)
這篇文章主要介紹了一個基礎(chǔ)語音識別題目-食物語音識別baseline(CNN),代碼詳細(xì)嗎,對于想要學(xué)習(xí)語音識別的朋友可以參考下2021-04-04Python加載數(shù)據(jù)的5種不同方式(收藏)
這篇文章主要介紹了Python加載數(shù)據(jù)的5種不同方式(收藏),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11采用Psyco實現(xiàn)python執(zhí)行速度提高到與編譯語言一樣的水平
這篇文章主要介紹了采用Psyco實現(xiàn)python執(zhí)行速度提高到與編譯語言一樣的水平的方法,是非常實用的Python第三方庫,需要的朋友可以參考下2014-10-10python實現(xiàn)的AES雙向?qū)ΨQ加密解密與用法分析
這篇文章主要介紹了python實現(xiàn)的AES雙向?qū)ΨQ加密解密與用法,簡單分析了AES加密解密算法的基本概念并結(jié)合實例形式給出了AES加密解密算法的相關(guān)實現(xiàn)技巧與使用注意事項,需要的朋友可以參考下2017-05-05在Python的Django框架中simple-todo工具的簡單使用
這篇文章主要介紹了在Python的Django框架中simple-todo工具的簡單使用,該工具基于原web.py中的開源項目,需要的朋友可以參考下2015-05-05