背景

在实现图片硬章插入文档的时候,遇到了如下的问题。 给出的硬章的背景是白色的,并不是想要的透明色。这样有什么影响呢?这里贴一个图片可以进行观察。

在这里插入图片描述

你觉得对于硬章来说是透明色更接近现实情况呢,还是直接贴图好呢?

思路介绍

对于硬章图片,需要把他的白色背景,或者说是浅色背景扣调,也就是在白色或者接近白色的地方(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实现相关推荐

  1. java窗体广告墙(图片上传)java广告系统

    java窗体广告墙(图片上传)java广告系统 public Swingtest002() {// 设置标题setTitle("请登陆");// 绝对布局setLayout(nul ...

  2. 《跟旺旺老师学Java》_第一章Java简介与JDK部署_第一部分Java是什么

    第一章:Java简介与JDK部署 第一部分:java是什么 "是白云,是瀑布,是海滩,不---,都不是,这是太原大理石二厂生产的景云牌大理石"看到这个标题,脑海中莫名的闪过这句小时 ...

  3. c枚举类型enum例题_一篇文章让你详细了解Java中Enum枚举类的使用

    文章前记 程序员工作久了便可能整日忙碌于"增删改查"中,迷失方向,毫无进步. 该公众号致力于分享软件开发相关的原创干货,助你完成从程序员到架构师的进阶之路! 努力!做一个NB的Co ...

  4. java 分析java死锁_有益的CountDownLatch和棘手的Java死锁

    java 分析java死锁 您是否曾经使用过java.util.concurrent.CountDownLatch ? 这是在两个或多个线程之间实现同步的非常方便的类,在该类中,一个或多个线程可以等待 ...

  5. aix系统java堆_浅谈AIX环境下的Java性能调优

    1.什么是Java Java 是一种面向对象的编程语言.它以 C++ 为模型,被设计成小的.简单的.在源和二进制级别跨平台的可移植的语言,Java 程序(applets 和应用程序)可以运行于任何已经 ...

  6. 安装java环境_(一)环境安装之Java

    安装java 点击 JDK8下载,根据自己的平台,选择相应的版本进行下载. 小知识: Java环境分JDK和JRE ,JDK就是Java Development Kit.简单的说JDK是面向开发人员使 ...

  7. cmd编译java命令_使用CMD命令编译和运行Java程序

    对于初学者来说,使用CMD命令(Unix以及类Unix系统采用Termial)来编译和运行Java的好处是让初学者直观地体会到编译(Compile)这一步骤,加深记忆.所谓编译就是将文本文件xxx.j ...

  8. 数据结构和算法 java实现_数据结构与算法——常用数据结构及其Java实现

    前言 仿佛一下子,2017年就快过去一半了,研一马上就要成为过去式了,我打算抓住研一的尾巴,好好梳理一下数据结构与算法,毕竟这些基础知识是很重要的嘛.所以准备在这里搞一个系列的文章,以期透彻. 本系列 ...

  9. java黄油刀_一篇文章玩转ButterKnife,让代码更简洁

    前言 话说,Android开发的兄弟们都知道,每次初始化控件,设置相应的事件,写的那点过程多而且恶心.我们先一块回顾下不堪的曾经~那些年,我们是这样初始化控件: // 每次的习惯上来写一个initVi ...

最新文章

  1. 【 FPGA 】FIR滤波器之 多个系数集问题以及 使用非整数实数的系数规范问题
  2. MapReduce学习总结之Combiner、Partitioner、Jobhistory
  3. python argparse中action 的可选参数store_true
  4. Kafka基本的概念
  5. Xshell选中的同时把内容复制到剪贴板(还可以设置设置文本分隔符)
  6. MD04读取的一些计算表
  7. height百分比失效
  8. R-大数据分析挖掘(5-R基础回顾)
  9. tomcat配置自动服务器地址,修改eclipse部署tomcat时服务器部署地址
  10. Leetcode 202.快乐数(哈希容器来检测是否出现重复)
  11. curl put方法 测试http_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!
  12. 时间加减计算器_小学生苦练加减乘除计算“基本功”,有没有必要?
  13. MySQL8的8大新SQL特性
  14. jenkins安装部署全过程
  15. SGU-169 Numbers(找规律)
  16. Activiti6详细教程
  17. PhpStorm10最新版破解注册激活码(图文版)
  18. 计算机及软件工程专业职称,有关软件工程师职称
  19. 区块链大本营专访 | MiiX全球技术开发者超级大赛,36小时,3支获胜队伍有哪些不一样的感受?
  20. How to compile a node file?如何编译一个节点文件?

热门文章

  1. char * const p; //常量指针,p的值不可以修改  char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p
  2. led灯串怎么摆造型_小串灯怎么挂好看
  3. HaaS EDU物联网项目实战:微信小程序实现云养花
  4. yum -- Failed connect to mirrors.aliyuncs.com:80; No route to host
  5. 重要!SpringBoot一个非常蛋疼的无法启动的问题解决
  6. Python让Excel飞起来—模块
  7. android 自适应图片轮播,Android使用Recyclerview实现图片轮播效果的方法
  8. FineReport表格软件-CSS动态切换年月日查询报表
  9. RunnLoop 讲解
  10. 网站域名被劫持,域名被劫持的解决方式