1.圖像裁剪、加邊框、旋轉(zhuǎn)(Python PIL)

? ? ? ? 日常工作中經(jīng)常要用Photoshop打印一些地質(zhì)圖,雖然說PS有動(dòng)作錄制的功能,但是打印這個(gè)功能我嘗試過錄制動(dòng)作后并未能成功運(yùn)行,而且要打印的圖像尺寸很多都是不同的,試了幾次后就放棄了,直到后來Python學(xué)起來了,通過pywinauto庫實(shí)現(xiàn)了這個(gè)功能,在這里就簡單記錄下吧。


? ? ? ? 在寫Photoshop的打印操作之前,先來回顧下打印之前的圖像處理工作。

? ? ? ? 接到的地質(zhì)圖多為MapGIS程序?qū)С龅膉pg圖片,偶爾也會有Tif格式的遙感圖。對這些圖像進(jìn)行打印很簡單,基本流程是:用PS打開圖像->裁剪圖像四周空白邊緣->為圖像四周加上3cm寬白色邊框(為了美觀和裝訂的需要)->打印。那為啥用PS來打印不直接用Windows自帶打印呢,應(yīng)該是打印需要用到PS特定的顏色處理模式吧,經(jīng)過試驗(yàn),通過兩種方式打出來的色彩效果確實(shí)是不同的。


就是它

? ? ? ? 打印前圖像處理的主要目標(biāo)很簡單:

? ? ? ? ? ? ? ? 1、裁剪圖像四周空白

? ? ? ? ? ? ? ? 2、為圖像四周加上3cm白色邊框? ?

下面就用Python實(shí)現(xiàn)它們

圖像處理主要用的是PIL這個(gè)庫,中途由于單位電腦比較舊(4g內(nèi)存Win7 32位系統(tǒng),后來重裝成64位了,體驗(yàn)就是搞這種東西必須整個(gè)64位系統(tǒng)),性能不太行了,也用Opencv整了下,還是感覺PIL稍微快那么一點(diǎn)點(diǎn),不知道是不是錯(cuò)覺呢。

(后來發(fā)現(xiàn)這兩步在PS錄個(gè)動(dòng)作也能輕松完成(???))


一、獲取所有圖片路徑

? ? ? ? 有時(shí)候要打印的圖片會放在好多個(gè)不同文件夾里面,要把它們遍歷出來:

import os

暫時(shí)不會用markdown,截圖吧

二、讀取圖片并裁剪四周空白

import PIL

傳入路徑img_path,返回的Size_info里存放了圖像的【路徑、寬度(mm)、高度(mm)、x分辨率、y分辨率】五項(xiàng)信息

獲得了圖像尺寸后接下來就要對圖像進(jìn)行邊緣空白的裁剪了(其實(shí)這兩步不分先后順序的):

裁剪的思路是網(wǎng)上搜到的,整理下就是:

? ? 1、先把圖像轉(zhuǎn)成灰度模式(值變成單一的0-255以方便判斷,如果要裁剪其他顏色我就不知道了,我這里只要裁掉最常見的由MapGIS導(dǎo)出的標(biāo)準(zhǔn)的白色邊緣)。

? ? 2、分別從四個(gè)方向掃描圖像,找到四個(gè)方向各自第一個(gè)灰度值不為255(最純粹的白色(???))的像素,記下它的坐標(biāo)(i,j)。

? ? 3、通過四組坐標(biāo)大小比較,得到圖像除了四周空白區(qū)域外的坐標(biāo)極值,也就得到了裁剪的區(qū)域左上(left,top)和右下坐標(biāo)(right,bottom)。

? ? 4、利用PIL.Image.crop(),完成圖像的裁剪。

? ? 5、沒了,就是后來發(fā)現(xiàn)PIL自帶這個(gè)算法,引用一下:使用PIL裁剪圖片白邊

? ? ? ? 要是用PS來做呢,‘圖像-裁切-確定’就完事了。

傳入一個(gè)PIL.Image對象,返回一個(gè)裁剪完的PIL.Image對象

三、給裁剪后的圖像加上x厘米的白色邊框

這一步主要是為了打印出來的圖規(guī)范且美觀。

傳入上一步返回的Size_info和白色邊緣的寬度border_width(cm),同樣返回一個(gè)PIL.Image對象

這一步要是用PS來搞,‘圖像-畫布大小-設(shè)置相對的寬度和高度’ 就好了

四、判斷圖像是否需要旋轉(zhuǎn)。

為什么要旋轉(zhuǎn)這些圖像呢?因?yàn)樽罱K是要把它們用打印機(jī)打印出來,而打印機(jī)能打印的最大寬度是有限的,所以就有了這個(gè)步驟。

單位的打印機(jī)型號是惠普的HP DesignJet Z6200 60 英寸照片打印機(jī),最大打印紙張寬度是60英寸,大約就是1524mm左右吧,除了最大尺寸外,日常還用到的紙張寬度有440、610、914、1067、1274等6、7種吧,所以出于節(jié)約打印時(shí)間和省錢的考慮,為每張圖選擇最合適的打印紙張寬度也是很有必要的。

判斷圖像是否需要旋轉(zhuǎn)的思路是這樣的:

? ? 1、比較圖像的寬和高,判斷誰是圖像的長邊和短邊。

? ? 2、短邊如果大于1524mm,這圖按1:1就打不出來了,超過打印機(jī)最大可裝入的紙張的寬度,把這個(gè)圖像文件放到Oversize_path路徑下,后續(xù)自己看著辦。

? ? 3、在短邊小于等于1524mm的前提下,根據(jù)對圖像寬高和長短邊的比較,有兩種需要旋轉(zhuǎn)的情況:

? ? ? ? ? ? 3.1 如果圖像的寬是長邊(矮胖的矩形),且寬大于1524mm,那么這圖得旋轉(zhuǎn)90°;

? ? ? ? ? ? 3.2 如果圖像的高是長邊(瘦高的矩形),且高小于1524mm,那么這圖也得旋轉(zhuǎn)90°。

傳入同樣是前面返回的Size_info,返回的就是經(jīng)過旋轉(zhuǎn)后的 PIL.Image對象了

*printTOtkinter()是個(gè)用tkinter搞的進(jìn)度顯示窗口,就輸出下一些文本信息而已。

五、為圖像選擇最合適的打印紙張尺寸

單位打印紙有438、610、914、1524等7種寬度,現(xiàn)在要選出最適合的一種來進(jìn)行打印。

在把短邊大于1524這種情況排除之后,剩下的圖像情況為短邊小于1524,即單位的打印機(jī)能打印出來了。

這時(shí)要判斷最佳打印用紙的寬度,有兩種情況需要考慮:

? ? 1、長邊>1524,改用短邊來比較選擇打印紙寬度。

? ? 2、長邊 ≤ 1524,用長邊來比較選擇打印紙寬度。

下面思路就是把要用作比較的邊長放入紙張寬度列表,把列表排序后找到比這個(gè)邊長大一點(diǎn)的那個(gè)紙張寬度。


主要的步驟就是這些,再經(jīng)過一頓復(fù)制粘貼完善一下其他細(xì)節(jié)之后,最后會得到一個(gè)存放打印信息的列表,把它用txt存起來,這樣后面的PS批量打印需要的信息就全部搞到手了。最后放個(gè)gif。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容