網站首頁 編程語言 正文
python保存圖片時和原圖大小一致
之前遇到過一次這個問題,當時解決了但是忘了記錄,這里再記錄一次好了。
1. matplotlib系列的
整體代碼如下:
import cv2
import matplotlib.pyplot as plt
name="1-1.png"
path="crop/"+name
src = cv2.imread(path)
img = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)
# Opencv和matplotlib讀取圖片的渠道不同,需要轉換
# cv2.imshow("original image", src)
# 獲取圖像的高度和寬度
plt.savefig('my_fig.png', dpi=my_dpi)
plt.imshow(img)
IMG = cv2.bitwise_not(img)
# 進行反色操作
# cv2.imshow("bitwise image", img)
mydpi=96
plt.figure(figsize=(Width/mydpi,Height/mydpi),dpi=mydpi)
# figsize中的單位是inches,重點解釋一下這個figsize參數,先寫寬度,再高度
"""
figsize : (float, float), optional, default: None width, height in inches. If not provided, defaults to:rc:`figure.figsize` = ``[6.4, 4.8]``
"""
plt.imshow(IMG)
plt.axis('off')
# 去掉坐標軸
# 保存
plt.savefig("processcrop/"+name,dpi=mydpi)
但是不知道為什么還是會有白邊。。。
注意:
- 如果是在jupyter lab中,plt.axis('off')就不會有問題,但是在jupyter notebook中,就會報錯。
jupyter lab中:
jupyter notebook中,再次恢復環境竟然好了,之前的報錯信息大概就是plt.axis("off")這個函數不接受bool類型的值
2. opencv系列的
opencv默認保存就是和原圖一樣的大小
name="1-1.png"
path="crop/"+name
src = cv2.imread(path)
plt.imshow(src[:, :, ::-1])
plt.axis('off')
img = cv2.bitwise_not(src)
cv2.imwrite("processcrop/"+name,img)
原圖:
保存后的圖:
參考——stack overflow的回答:Specifying and saving a figure with exact size in pixels
plt.figure(figsize=(800/my_dpi, 800/my_dpi), dpi=my_dpi)
# 假設有一個800×800pix的圖,要顯示在本機電腦dpi為96的電腦上,則要保持原圖大小顯示就可以使用上述代碼。
plt.savefig('my_fig.png', dpi=my_dpi)
# 保存成相同分辨率,使用上述代碼
# 如果想把分辨率提高10倍,則可以進行如下方式,則就保存了一個8000X8000的高清圖
plt.savefig('my_fig.png', dpi=my_dpi * 10)
另外根據另一個回答:How to get matplotlib figure size
import matplotlib.plt
fig = plt.figure()
# 在構建畫布的時候就已經有一個默認的分辨率了
size = fig.get_size_inches()*fig.dpi # size in pixels
python批量處理圖片統一尺寸
方法一:
import numpy as np
import os
import cv2
# 設置圖片路徑,該路徑下包含了14張jpg格式的照片,名字依次為0.jpg, 1.jpg, 2.jpg,...,14.jpg
DATADIR="D:\Code\ToolBox"
#設置目標像素大小,此處設為300'''
IMG_SIZE=300
#使用os.path模塊的join方法生成路徑'''
path=os.path.join(DATADIR)?
#使用os.listdir(path)函數,返回path路徑下所有文件的名字,以及文件夾的名字,
#例如,執行下行代碼后,img_list是一個list,值為['0.jpg','1.jpg','10.jpg','11.jpg','12.jpg','13.jpg','14.jpg',
#'2.jpg','3.jpg','4.jg', '5.jpg', '6.jpg', '7.jpg',?
#'8.jpg', '9.jpg'],注意這個順序并沒有按照從小到大的順序排列'''
img_list=os.listdir(path)
ind=0
for i in img_list:
?? ?#調用cv2.imread讀入圖片,讀入格式為IMREAD_COLOR'''
? ? img_array=cv2.imread(os.path.join(path,i),cv2.IMREAD_COLOR)
? ? #'''調用cv2.resize函數resize圖片'''
? ? new_array=cv2.resize(img_array,(IMG_SIZE,IMG_SIZE))
? ? img_name=str(ind)+'.jpg'
? ? #'''生成圖片存儲的目標路徑'''
? ? save_path='D:\\Code\\resized\\'+str(ind)+'.jpg'
? ? ind=ind+1
? ? #'''調用cv.2的imwrite函數保存圖片'''
? ? cv2.imwrite(save_path,new_array)
方法二:
#提取目錄下所有圖片,更改尺寸后保存到另一目錄
from PIL import Image
import os.path
import glob
def convertjpg(jpgfile,outdir,width=128,height=128):
? ? img=Image.open(jpgfile)
? ? try:
? ? ? ? new_img=img.resize((width,height),Image.BILINEAR) ??
? ? ? ? new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))
? ? except Exception as e:
? ? ? ? print(e)
for jpgfile in glob.glob("E:\\img\\*.jpg"):
? ? convertjpg(jpgfile,"E:\\lianhua")
方法三:該方法批量修改圖片大小和文件夾名稱
import os
from PIL import Image
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r'c:\windows\fonts\SimSun.ttc', size=14)
# 獲取當前路徑
path_abs = os.getcwd()
print u'*****************開始文件名更名操作*****************'
print path_abs
# 遍歷當前路徑下的文件以及文件目錄
for root, dir_name, file_name in os.walk(path_abs):
? ? # 統計文件夾個數
? ? num_dir = len(dir_name)
? ? for idx, item in enumerate(dir_name):
? ? ? ? print u'第', idx, u'個文件正在更名......'
? ? ? ? item_new = 'test_' + '0' * (1 - idx / 10) + str(idx)
? ? ? ? # 原文件路徑
? ? ? ? path_dir_old = path_abs + '\\' + item
? ? ? ? # print u'原文件路徑:', path_dir_old
? ? ? ? # 新文件路徑
? ? ? ? path_dir_new = path_abs + '\\' + item_new
? ? ? ? # print u'新文件路徑:', path_dir_new
? ? ? ? # 更名操作
? ? ? ? os.renames(path_dir_old, path_dir_new)
print u'*****************文件名更名完畢!*****************'
print u'*****************圖片名更名*******************'
for root1, dir_name1, file_name1 in os.walk(path_abs):
? ? num1_dir = len(dir_name1)
? ? for idx1, item1 in enumerate(dir_name1):
? ? ? ? path_dir1 = path_abs + '\\' + item1
? ? ? ? for root2, dir_name2, file_name2 in os.walk(path_dir1):
? ? ? ? ? ? for idx2, item2 in enumerate(file_name2):
? ? ? ? ? ? ? ? # 原路徑 + 圖片名
? ? ? ? ? ? ? ? item2_old = path_dir1 + '\\' + item2
? ? ? ? ? ? ? ? # 新路徑 + 圖片名(強制轉換成jpg格式,數字6制定圖片名長度以及0的填充個數)
? ? ? ? ? ? ? ? item_new2 = 'idx_'+ '0' * (5 - len(str(idx2))) + str(idx2)
? ? ? ? ? ? ? ? item2_new = path_dir1 + '\\' + item_new2 + '.jpg'
? ? ? ? ? ? ? ? # 更名
? ? ? ? ? ? ? ? os.rename(item2_old, item2_new)
? ? ? ? ? ? ? ? # resize 成指定尺寸大小
? ? ? ? ? ? ? ? img = Image.open(item2_new)
? ? ? ? ? ? ? ? img_new = img.resize((220, 220))
? ? ? ? ? ? ? ? # save 保存
? ? ? ? ? ? ? ? img_new.save(item2_new)
原文鏈接:https://blog.csdn.net/Castlehe/article/details/116979507
相關推薦
- 2022-06-02 Python學習之隨機模塊random詳解_python
- 2022-03-26 C++函數指針的用法詳解_C 語言
- 2022-12-15 詳解C#中HttpClient的用法及相關問題的解決方法_C#教程
- 2022-12-23 python類中的self和變量用法及說明_python
- 2023-03-16 C語言進階之字符串查找庫函數詳解_C 語言
- 2022-12-21 C++?STL容器與函數謂詞示例分析講解_C 語言
- 2022-06-30 詳解Go語言中泛型的實現原理與使用_Golang
- 2022-01-03 當前時間與新年倒計時
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支