爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4435|回复: 2

[混合编程] IDL之图片白底透明化

[复制链接]

新浪微博达人勋

发表于 2020-7-3 15:23:42 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
一、需求来源


有时我们画图会有“非矩形”的情况,例如我们要画个圆,或者行政区图,出图时会被自动用白色补成矩形,
后续使用时,比如贴到地图上,这些白色部分就比较碍眼,显得不专业,
于是,我写了个函数,用于将图片中纯白部分(该位置rgb和接近255*3)做透明处理(即alpha层设为0)
非纯白部分,可按需求自行设置透明度


白底透明化.png



二、源代码


;该程序用于把一张图中纯白部分做成透明,其他部分透明度可自由设置
;infile是待处理图的绝对路径
;函数名释义:trans为透明之意,png为输出文件格式
pro transPng,infile
  cut=strsplit(infile,'\',/extract)
  cut=strsplit(infile,'.',/extract)
  ;根据文件后缀不同分别读取:
  if(cut[-1] eq 'png')then begin
    read_png,infile,ima
  endif
  if(cut[-1] eq 'jpg' or cut[-1] eq 'jpeg')then begin
    read_jpeg,infile,ima
  endif


  ;不论三层的jpg还是四层的png,只使用前三层rgb:
  ima=ima[0:2,*,*]
  sz=size(ima)
  ;新建一个文件用于输出png:
  png=bytarr(4,sz[2],sz[3])
  ;把rgb前三层放入输出文件的前三层,
  ;第四层初始值0,后面检查前三层中不是纯白的都赋予255,纯白的保持全透明0
  png[0:2,*,*]=ima
  png[3,*,*]=0
  ;制作alpha层,初始值都是0
  one=bytarr(sz[2],sz[3])
  ;rgb三层和是255*3就是本白/纯白,不是纯白的alpha值赋予255
  t=total(ima,1);求和
  ;[254,254,253]这种也算白色,这个可以自由设置
  p=where(t le 255*3-9,count)


  ;设置非白色部分的透明度,可以是全不透明255,如果有底图要显示可以半透明128
    one[p]=255


  ;把alpha层赋给输出变量的第四层
  png[3,*,*]=one
  ;按原图名输出png图(会覆盖),也可改为其他名字:
  write_png,infile,png
end


密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-7-31 21:20:17 | 显示全部楼层
妙啊,在某些情况下可以代替掩膜了。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-8-1 12:41:59 | 显示全部楼层
SonGoku 发表于 2020-7-31 21:20
妙啊,在某些情况下可以代替掩膜了。

虽然IDL有专门的掩膜处理,但并不通用,该帖子的方法可以支持在python和JavaScript上实现相同的效果
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表