java抠图_硬章图片的透明化【抠图】java/android实现
背景
在实现图片硬章插入文档的时候,遇到了如下的问题。 给出的硬章的背景是白色的,并不是想要的透明色。这样有什么影响呢?这里贴一个图片可以进行观察。
在这里插入图片描述
你觉得对于硬章来说是透明色更接近现实情况呢,还是直接贴图好呢?
思路介绍
对于硬章图片,需要把他的白色背景,或者说是浅色背景扣调,也就是在白色或者接近白色的地方(255 255 255)给他的alpha 通道设置成0,对于有信息的地方(深色)alpha设置255,这样就是实现了硬章抠图。
避坑
如果是用opencv 实现的话也没有什么好写的,这里主要使用java 实现了抠图的过程,并在android中重写了该方法。
在java中是无法给colorModel 是RGB图片进行设置透明通道的,这里需要把图片变成ARGB的,这里可以通过Graphics2D进行转化
基本流程
读取图片
判断颜色模式,并统一到ARGB
遍历像素
浅色点设置透明通道为0
代码讲解
java实现
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
* @name SignImage
* @date 2020/6/3 20:28
*/
public class SignImage {
public static void main(String[] args) throws IOException {
String filePath = "D://sign.jpg";
//读取图片
BufferedImage imageTmp = ImageIO.read(new File(filePath));
int alphaLocal = imageTmp.getColorModel().getAlpha(0);
//统一图片到argb
if(imageTmp.getColorModel().getNumComponents() == 3){
BufferedImage teemp = new BufferedImage(imageTmp.getWidth(),imageTmp.getHeight(),6);
//6 是argb的意思
//借助graphics 转argb
Graphics2D graphics2D = DrawPictureUitl.getGraphics(teemp,
imageTmp.getWidth(),imageTmp.getHeight(),1);
graphics2D.drawImage(imageTmp,0,0,null);
imageTmp = teemp;
graphics2D.dispose();
}
if ( alphaLocal == 255){
int alpha = 0;
//遍历像素。可以并行
for (int j1 = imageTmp.getMinY(); j1 < imageTmp
.getHeight(); j1++) {
for (int j2 = imageTmp.getMinX(); j2 < imageTmp
.getWidth(); j2++) {
int rgb = imageTmp.getRGB(j2, j1);
if (colorInRange(rgb)){
alpha = 0;
}
else{
alpha = 250;
}
rgb = (alpha << 24) | (rgb & 0x00ffffff);
imageTmp.setRGB(j2, j1, rgb);
}
}
}
//保存图片
ImageIO.write(imageTmp, "png", new File("d://test.png"));
}
//检测颜色是否需要加透明通道
public static boolean colorInRange(int color) {
int red = (color & 0xff0000) >> 16;
int green = (color & 0x00ff00) >> 8;
int blue = (color & 0x0000ff);
if (red >= 230 && green >= 230 && blue >= 230)
{return true;}
return false;
}
}
对于android 来说,处理的是bitmap ,原理是一样的
//把白色转换成透明
public static Bitmap getImageToChange(Bitmap mBitmap) {
Bitmap createBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Config.ARGB_8888);
if (mBitmap != null) {
int mWidth = mBitmap.getWidth();
int mHeight = mBitmap.getHeight();
for (int i = 0; i < mHeight; i++) {
for (int j = 0; j < mWidth; j++) {
int color = mBitmap.getPixel(j, i);
int g = Color.green(color);
int r = Color.red(color);
int b = Color.blue(color);
int a = Color.alpha(color);
if(g>=250&&r>=250&&b>=250){
a = 0;
}
color = Color.argb(a, r, g, b);
createBitmap.setPixel(j, i, color);
}
}
}
return createBitmap;
}
java抠图_硬章图片的透明化【抠图】java/android实现相关推荐
- java窗体广告墙(图片上传)java广告系统
java窗体广告墙(图片上传)java广告系统 public Swingtest002() {// 设置标题setTitle("请登陆");// 绝对布局setLayout(nul ...
- 《跟旺旺老师学Java》_第一章Java简介与JDK部署_第一部分Java是什么
第一章:Java简介与JDK部署 第一部分:java是什么 "是白云,是瀑布,是海滩,不---,都不是,这是太原大理石二厂生产的景云牌大理石"看到这个标题,脑海中莫名的闪过这句小时 ...
- c枚举类型enum例题_一篇文章让你详细了解Java中Enum枚举类的使用
文章前记 程序员工作久了便可能整日忙碌于"增删改查"中,迷失方向,毫无进步. 该公众号致力于分享软件开发相关的原创干货,助你完成从程序员到架构师的进阶之路! 努力!做一个NB的Co ...
- java 分析java死锁_有益的CountDownLatch和棘手的Java死锁
java 分析java死锁 您是否曾经使用过java.util.concurrent.CountDownLatch ? 这是在两个或多个线程之间实现同步的非常方便的类,在该类中,一个或多个线程可以等待 ...
- aix系统java堆_浅谈AIX环境下的Java性能调优
1.什么是Java Java 是一种面向对象的编程语言.它以 C++ 为模型,被设计成小的.简单的.在源和二进制级别跨平台的可移植的语言,Java 程序(applets 和应用程序)可以运行于任何已经 ...
- 安装java环境_(一)环境安装之Java
安装java 点击 JDK8下载,根据自己的平台,选择相应的版本进行下载. 小知识: Java环境分JDK和JRE ,JDK就是Java Development Kit.简单的说JDK是面向开发人员使 ...
- cmd编译java命令_使用CMD命令编译和运行Java程序
对于初学者来说,使用CMD命令(Unix以及类Unix系统采用Termial)来编译和运行Java的好处是让初学者直观地体会到编译(Compile)这一步骤,加深记忆.所谓编译就是将文本文件xxx.j ...
- 数据结构和算法 java实现_数据结构与算法——常用数据结构及其Java实现
前言 仿佛一下子,2017年就快过去一半了,研一马上就要成为过去式了,我打算抓住研一的尾巴,好好梳理一下数据结构与算法,毕竟这些基础知识是很重要的嘛.所以准备在这里搞一个系列的文章,以期透彻. 本系列 ...
- java黄油刀_一篇文章玩转ButterKnife,让代码更简洁
前言 话说,Android开发的兄弟们都知道,每次初始化控件,设置相应的事件,写的那点过程多而且恶心.我们先一块回顾下不堪的曾经~那些年,我们是这样初始化控件: // 每次的习惯上来写一个initVi ...
最新文章
- 【 FPGA 】FIR滤波器之 多个系数集问题以及 使用非整数实数的系数规范问题
- MapReduce学习总结之Combiner、Partitioner、Jobhistory
- python argparse中action 的可选参数store_true
- Kafka基本的概念
- Xshell选中的同时把内容复制到剪贴板(还可以设置设置文本分隔符)
- MD04读取的一些计算表
- height百分比失效
- R-大数据分析挖掘(5-R基础回顾)
- tomcat配置自动服务器地址,修改eclipse部署tomcat时服务器部署地址
- Leetcode 202.快乐数(哈希容器来检测是否出现重复)
- curl put方法 测试http_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!
- 时间加减计算器_小学生苦练加减乘除计算“基本功”,有没有必要?
- MySQL8的8大新SQL特性
- jenkins安装部署全过程
- SGU-169 Numbers(找规律)
- Activiti6详细教程
- PhpStorm10最新版破解注册激活码(图文版)
- 计算机及软件工程专业职称,有关软件工程师职称
- 区块链大本营专访 | MiiX全球技术开发者超级大赛,36小时,3支获胜队伍有哪些不一样的感受?
- How to compile a node file?如何编译一个节点文件?
热门文章
- char * const p; //常量指针,p的值不可以修改 char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p
- led灯串怎么摆造型_小串灯怎么挂好看
- HaaS EDU物联网项目实战:微信小程序实现云养花
- yum -- Failed connect to mirrors.aliyuncs.com:80; No route to host
- 重要!SpringBoot一个非常蛋疼的无法启动的问题解决
- Python让Excel飞起来—模块
- android 自适应图片轮播,Android使用Recyclerview实现图片轮播效果的方法
- FineReport表格软件-CSS动态切换年月日查询报表
- RunnLoop 讲解
- 网站域名被劫持,域名被劫持的解决方式