JAVA语言图像处理教程之(指定区域内)灰度化、透明化(alpha通道)处理
小标 2018-10-12 来源 : 阅读 1752 评论 0

摘要:本文主要向大家介绍了JAVA语言图像处理教程之(指定区域内)灰度化、透明化(alpha通道)处理,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言图像处理教程之(指定区域内)灰度化、透明化(alpha通道)处理,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


近日在一家小公司实习,老板要求我写一个图形编辑器,其中涉及到用java处理图像。一般图像处理python用的比较多,感觉网上关于java处理图像的资料不是很多(也许是因为我没有认真的去翻吧……)所以想把自己处理的一些想法记录一下。


灰度化


图片的rgb通道alpha通道什么的我暂时就不细讲了,网上资料很多。先说一下怎么读一个图片。



private BufferedImage initBufferedImage(String imagePath) {

  File file = new File(imagePath);

  BufferedImage image = null;

  try {

image = ImageIO.read(file);

  } catch (IOException e) {

e.printStackTrace();

  }

  return image;

 }

   



将图片灰度化其实很简单


private BufferedImage grayProcess(BufferedImage sourceImage){

 int width = sourceImage.getWidth();

 int height = sourceImage.getHeight();

 BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);// BufferedImage.TYPE_BYTE_GRAY指定了这是一个灰度图片 

 for(int i= 0 ; i < width ; i++){  

for(int j = 0 ; j < height; j++){  

 int rgb = image.getRGB(i, j);  

 grayImage.setRGB(i, j, rgb);  

  }  

 } 

}

   



接下来当然是要将图片写成文件


private void writeBufferedImage(BufferedImage img,String filePath){

  String format = filePath.substring(filePath.indexOf('.')+1);

  //获取图片格式

  System.out.println(format);

  try {

ImageIO.write(img,format,new File(filePath));

  } catch (IOException e) {

e.printStackTrace();

  }

 }

   



设置图片透明度


下面这段代码可以将图片的背景色设为透明,当然图片不能太复杂,而且背景色要比轮廓的颜色浅。给个例子,左边原图,右边处理过的图。


/**

简单介绍一下思路,首先遍历所有像素,计算一下整张图的灰度的平均值(grayMean),轮廓颜色较深,灰度值比较小,背景颜色较浅,灰度值较大,加权平均之后总的平均值会比背景的灰度值略低,然后再次遍历所有像素,并计算每个像素点的灰度,如果其灰度值比grayMean大,则将其alpha值设为0,即完全透明,否则不做处理。

*/

package imageprocess;

 

import java.awt.image.BufferedImage;

 

/**

 * Created by alex on 7/24/16.

 */

public class AlphaProcessor {

 /**

  * 处理透明度

  */

 public BufferedImage alphaProcess(BufferedImage bufferedImage) {

  //获取源图像的宽高

  int width = bufferedImage.getWidth();

  int height = bufferedImage.getHeight();

  System.out.println(width+" "+height);

 //实例化一个同样大小的图片,并将type设为 BufferedImage.TYPE_4BYTE_ABGR,支持alpha通道的rgb图像

  BufferedImage resImage = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);

 

  double grayMean = 0;

  for (int i = 0; i < width; i++) {

for (int j = 0; j < height; j++) {

 int rgb = bufferedImage.getRGB(i,j);

 int r = (0xff&rgb);

 int g = (0xff&(rgb>>8));

 int b = (0xff&(rgb>>16));

 //这是灰度值的计算公式

 grayMean += (r*0.299+g*0.587+b*0.114);

}

  }

  //计算平均灰度

  grayMean = grayMean/(width*height);

 

  for (int i = 0; i < width; i++) {

for (int j = 0; j < height; j++) {

 int rgb = bufferedImage.getRGB(i,j);

 //一个int是32位,java中按abgr的顺序存储,即前8位是alpha,最后8位是r,所以可以通过下面的方式获取到rgb的值

 int r = (0xff&rgb);

 int g = (0xff&(rgb>>8));

 int b = (0xff&(rgb>>16));

 double gray = (r*0.299+g*0.587+b*0.114);

 //如果灰度值大于之前求的平均灰度值,则将其alpha设为0,下面准确写应该是rgb = r + (g << 8) + (b << 16) + (0 << 24);

 if (gray>grayMean){

  rgb = r + (g << 8) + (b << 16);

 }

 resImage.setRGB(i,j,rgb);

}

  }

  //ok,返回的就是将浅色背景设为透明的BufferedImage了,可以用灰度化里提到的方式写成文件

  return resImage;

 }

}

   



在指定区域内进行处理


想必看到这篇博客的人都接触过photoshop,photoshop可以在一个先用选框工具选中一个区域,然后在这个区域内进行一系列操作,比如之前提到的设置透明度和灰度处理。

先说一下我大致是怎么实现的,首先是将图片放到一个JLabel上,然后为这个JLabel加listener监听鼠标的点击事件,获取鼠标点击的坐标,然后将这些点连起来就围成一个选框,然后设置一个掩码,以确定哪些点在选框内,然后就可以只针对选框内的像素点或者选框外的像素点操作。Talk is cheap, show me the code.


先上这个demo跑完之后的图吧



我点了三个点,然后点击ok,之后程序就会将这三个点围出的区域内图像的透明度设为100,当然你也可以在这个区域内对这块像素点做一些别的操作。

比较重要的一块是getMask() 这个方法


package view;

 

import javax.swing.*;

import java.awt.*;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.geom.GeneralPath;

import java.awt.image.BufferedImage;

import java.util.ArrayList;

import java.util.List;



本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 0
看完这篇文章有何感觉?已经有2人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved