清纯 在写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。
# -*- coding: UTF-8 -*-
#scrip
# 使用shp数据批量返则裁剪圆大栅格数据并统计均值
print"使用shp数据批量裁剪栅格数据并统计结果均值"
###########修改部分###########
ras_file= r"D:\python\nc\GLEAM\Transpiration_TIF_OUT" #待裁剪的原始栅格数据存储文件夹路径
suffix= 'tif' #待裁剪的原始栅格数据后缀
bvalue=-999.0 #待裁剪的原始栅格数据背景值
shp_file= r"D:\python\shp" #裁剪所需shp模漏腔棚板数据存储文件夹路径
ras_file_cut= r"D:\python\nc\GLEAM\Transpiration_YR_SWAT_mask" #裁剪后栅格数据结果存储文件夹路径
txtname=r"D:\python\nc\GLEAM\Transpiration_YR_SWAT_mask" #输出统计文本路径
#############################
#计算部分
import fenqutongji_arcpy
fenqutongji_arcpy.env.workspace=shp_file
shps=fenqutongji_arcpy.ListFeatureClasses()
fenqutongji_arcpy.env.workspace=ras_file
ras=fenqutongji_arcpy.ListRasters('*', suffix)
print "共有"+str(len(ras))+"个栅格数据"
#
print "Processing......"
for shin shps:
shtmp=sh.encode('cp936')
shpfile=shp_file+"\\"+shtmp
print "共有"+str(len(shps))+"个shp数据,正在处理第"+str(shps.index(sh)+1)+"个:"+shtmp
result=[]
for rsin ras:
rstmp=rs.encode('cp936')
outname=ras_file_cut+"\\"+rstmp[0:len(rstmp)-4]+shtmp[0:len(shtmp)-4]+".tif"
#arcpy.Clip_management(rstmp,"#",outname,shpfile,"#","ClippingGeometry")
fenqutongji_arcpy.Clip_management(rstmp, "#", outname, shpfile, str(bvalue), "ClippingGeometry")#忽略无效值
stats=fenqutongji_arcpy.GetRasterProperties_management(outname, "MEAN")
result.append(rstmp+' '+str(stats)+"\n")
# try:
# arcpy.Delete_management(outname,"")#注释则裁剪的栅格不删除,不注释删掉。
# except:
print(outname+'cannot delete')
file(txtname+"\\"+shtmp[0:len(shtmp)-4]+".txt",'w').writelines(result)
print "Finish!"
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)