? ? ? ? 日常工作中經(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

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

獲得了圖像尺寸后接下來就要對圖像進(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來做呢,‘圖像-裁切-確定’就完事了。

三、給裁剪后的圖像加上x厘米的白色邊框
這一步主要是為了打印出來的圖規(guī)范且美觀。

這一步要是用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°。

*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。
