在寫Photoshop的打印操作之前,先來回顧下打印之前的圖像處理工作。
接到的地質圖多為MapGIS程序導出的jpg圖片,偶爾也會有Tif格式的遙感圖。對這些圖像進行打印很簡單,基本流程是:用PS打開圖像->裁剪圖像四周空白邊緣->為圖像四周加上3cm寬白色邊框(為了美觀和裝訂的需要)->打印。那為啥用PS來打印不直接用Windows自帶打印呢,應該是打印需要用到PS特定的顏色處理模式吧,經過試驗,通過兩種方式打出來的色彩效果確實是不同的。
打印前圖像處理的主要目標很簡單:
1、裁剪圖像四周空白
2、為圖像四周加上3cm白色邊框
下面就用Python實現它們
圖像處理主要用的是PIL這個庫,中途由於單位電腦比較舊(4g內存Win7 32位系統,後來重裝成64位了,體驗就是搞這種東西必須整個64位系統),性能不太行了,也用Opencv整了下,還是感覺PIL稍微快那麽壹點點,不知道是不是錯覺呢。
(後來發現這兩步在PS錄個動作也能輕松完成())
壹、獲取所有圖片路徑
有時候要打印的圖片會放在好多個不同文件夾裏面,要把它們遍歷出來:
import os
二、讀取圖片並裁剪四周空白
import PIL
獲得了圖像尺寸後接下來就要對圖像進行邊緣空白的裁剪了(其實這兩步不分先後順序的):
裁剪的思路是網上搜到的,整理下就是:
1、先把圖像轉成灰度模式(值變成單壹的0-255以方便判斷,如果要裁剪其他顏色我就不知道了,我這裏只要裁掉最常見的由MapGIS導出的標準的白色邊緣)。
2、分別從四個方向掃描圖像,找到四個方向各自第壹個灰度值不為255(最純粹的白色())的像素,記下它的坐標(i,j)。
3、通過四組坐標大小比較,得到圖像除了四周空白區域外的坐標極值,也就得到了裁剪的區域左上(left,top)和右下坐標(right,bottom)。
4、利用PIL.Image.crop(),完成圖像的裁剪。
5、沒了,就是後來發現PIL自帶這個算法,引用壹下: 使用PIL裁剪圖片白邊
要是用PS來做呢,‘圖像-裁切-確定’就完事了。
三、給裁剪後的圖像加上x厘米的白色邊框
這壹步主要是為了打印出來的圖規範且美觀。
這壹步要是用PS來搞,‘圖像-畫布大小-設置相對的寬度和高度’ 就好了
四、判斷圖像是否需要旋轉。
為什麽要旋轉這些圖像呢?因為最終是要把它們用打印機打印出來,而打印機能打印的最大寬度是有限的,所以就有了這個步驟。
單位的打印機型號是惠普的HP DesignJet Z6200 60 英寸照片打印機,最大打印紙張寬度是60英寸,大約就是1524mm左右吧,除了最大尺寸外,日常還用到的紙張寬度有440、610、914、1067、1274等6、7種吧,所以出於節約打印時間和省錢的考慮,為每張圖選擇最合適的打印紙張寬度也是很有必要的。
判斷圖像是否需要旋轉的思路是這樣的:
1、比較圖像的寬和高,判斷誰是圖像的長邊和短邊。
2、短邊如果大於1524mm,這圖按1:1就打不出來了,超過打印機最大可裝入的紙張的寬度,把這個圖像文件放到Oversize_path路徑下,後續自己看著辦。
3、在短邊小於等於1524mm的前提下,根據對圖像寬高和長短邊的比較,有兩種需要旋轉的情況:
3.1 如果圖像的寬是長邊(矮胖的矩形),且寬大於1524mm,那麽這圖得旋轉90°;
3.2 如果圖像的高是長邊(瘦高的矩形),且高小於1524mm,那麽這圖也得旋轉90°。
*printTOtkinter()是個用tkinter搞的進度顯示窗口,就輸出下壹些文本信息而已。
五、為圖像選擇最合適的打印紙張尺寸
單位打印紙有438、610、914、1524等7種寬度,現在要選出最適合的壹種來進行打印。
在把短邊大於1524這種情況排除之後,剩下的圖像情況為短邊小於1524,即單位的打印機能打印出來了。
這時要判斷最佳打印用紙的寬度,有兩種情況需要考慮:
1、長邊>1524,改用短邊來比較選擇打印紙寬度。
2、長邊 ≤ 1524,用長邊來比較選擇打印紙寬度。
下面思路就是把要用作比較的邊長放入紙張寬度列表,把列表排序後找到比這個邊長大壹點的那個紙張寬度。
主要的步驟就是這些,再經過壹頓復制粘貼完善壹下其他細節之後,最後會得到壹個存放打印信息的列表,把它用txt存起來,這樣後面的PS批量打印需要的信息就全部搞到手了。最後放個gif。