java image 透明_java的BufferedImage对象透明化背景

近用到Java动态生成背景透明的图片功能,从gif和png中选择了png格式,个中缘由就不说了,于是动手到网上搜索有用的代码。现把搜索结果总结如下:

1. 生成png图片

int width = 400;

int height = 300;

// 创建BufferedImage对象

BufferedImage image = new BufferedImage(width, height,     BufferedImage.TYPE_INT_RGB);

// 获取Graphics2D

Graphics2D g2d = image.createGraphics();

// 画图

g2d.setColor(new Color(255,0,0));

g2d.setStroke(new BasicStroke(1));

g2d.draw

//释放对象

g2d.dispose();

// 保存文件

ImageIO.write(image, "png", new File("c:/test.png"));

int width = 400;

int height = 300;

// 创建BufferedImage对象

BufferedImage image = new BufferedImage(width, height,     BufferedImage.TYPE_INT_RGB);

// 获取Graphics2D

Graphics2D g2d = image.createGraphics();

// 画图

g2d.setColor(new Color(255,0,0));

g2d.setStroke(new BasicStroke(1));

g2d.draw

//释放对象

g2d.dispose();

// 保存文件

ImageIO.write(image, "png", new File("c:/test.png"));

这只是绘制图形的代码,其背景是黑色的,如何才能背景透明呢?继续搜索,没有得到结果,不过搜出以下代码,它只是把自己绘制的图形设置为透明或半透明,背景并不透明,如下:

2. 绘制半透明图形

int width = 400;

int height = 300;

// 创建BufferedImage对象

BufferedImage image = new BufferedImage(width, height,     BufferedImage.TYPE_INT_RGB);

// 获取Graphics2D

Graphics2D g2d = image.createGraphics();

// 设置透明度

g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1.0f)); // 1.0f为透明度 ,值从0-1.0,依次变得不透明

// 画图

g2d.setColor(new Color(255,0,0));

g2d.setStroke(new BasicStroke(1));

g2d.draw

//释放对象

//透明度设置 结束

g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

g2d.dispose();

// 保存文件

ImageIO.write(image, "png", new File("c:/test.png"));

这样绘制的图形应该说是前景透明的,背景依然是黑色,:(

网上没有看到有益的代码,在csdn上一位说自己实现了,但却没有说怎么实现的,没办法只能自己摸索了,耗了半个多小时,几乎查看了BufferedImage 和Graphics2D 所有方法和属性,终于找到了解决方案,只不过是增加两行代码而已,如下:

int width = 400;

int height = 300;

// 创建BufferedImage对象

BufferedImage image = new BufferedImage(width, height,     BufferedImage.TYPE_INT_RGB);

// 获取Graphics2D

Graphics2D g2d = image.createGraphics();

// ---------- 增加下面的代码使得背景透明 -----------------

image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);

g2d.dispose();

g2d = image.createGraphics();

// ---------- 背景透明代码结束 -----------------

// 画图

g2d.setColor(new Color(255,0,0));

g2d.setStroke(new BasicStroke(1));

g2d.draw

//释放对象

g2d.dispose();

// 保存文件

ImageIO.write(image, "png", new File("c:/test.png"));

================================================

白背景变透明

package com.goldgrid.socket.client;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.File;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

import org.apache.log4j.Logger;

public class Alpha {

protected static Logger logger = Logger.getLogger(ClientSocket.class);

public byte[] transferAlpha(Image image) {

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

try {

ImageIcon imageIcon = new ImageIcon(image);

BufferedImage bufferedImage = new BufferedImage(imageIcon

.getIconWidth(), imageIcon.getIconHeight(),

BufferedImage.TYPE_4BYTE_ABGR);

Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();

g2D.drawImage(imageIcon.getImage(), 0, 0, imageIcon

.getImageObserver());

int alpha = 0;

for (int j1 = bufferedImage.getMinY(); j1 

.getHeight(); j1++) {

for (int j2 = bufferedImage.getMinX(); j2 

.getWidth(); j2++) {

int rgb = bufferedImage.getRGB(j2, j1);

int R =(rgb & 0xff0000 ) >> 16 ;

int G= (rgb & 0xff00 ) >> 8 ;

int B= (rgb & 0xff );

if(((255-R)<30) && ((255-G)<30) && ((255-B)<30)){

rgb = ((alpha + 1) <

}

bufferedImage.setRGB(j2, j1, rgb);

}

}

g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());

//ImageIO.write(bufferedImage, "png", new File("d:/test.png.png"));

ImageIO.write(bufferedImage, "png", byteArrayOutputStream);

} catch (Exception e) {

logger.error(e.toString());

}finally{

}

return byteArrayOutputStream.toByteArray();

}

}

提供个比较傻的思路1.取得控件背景色2.指定需要透明的颜色3.逐点扫描image,把需要透明的颜色setRGB成控件背景色预想:效率很低我记得我以前用过很简单的方法,设置透明色的,不过忘了怎么用的了,呵呵

BufferedImage temp =  ImageIO.read(

new File("chess.bmp"));//取得图片

int imgHeight = temp.getHeight();//取得图片的长和宽

int imgWidth = temp.getWidth();

int c = temp.getRGB(3,3);

BufferedImage bi =new BufferedImage(imgWidth, imgHeight,

BufferedImage.TYPE_4BYTE_ABGR);//新建一个类型支持透明的BufferedImage

for(int i =0; i 

{

for(int j =0; j 

{

if(temp.getRGB(i, j) == c)

bi.setRGB(i, j, c &0x00ffffff);//这里把背景设为透明

else

bi.setRGB(i, j, temp.getRGB(i, j));

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL学习笔记009】事务

一、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 二、事务操作 1、操作1 查看/设置事务提交方式 select a…

python的pypi安装_python pip及安装包安装

python 微信聊天D:\untitled\hello.py 入口 web禁止登陆。。安装命令&#xff1a;手动安装&#xff1a;D:\python\setuptools-41.2.0>python setup.py install下载下来手动安装pipD:\python\pip-1.4.1\pip-1.4.1>python setup.py installD:\python\setuptools-41.2.0>…

python 爬取生意参谋数据_如何爬取生意参谋数据?是不是违规操作?

1、在淘宝选项卡中&#xff0c;打开【生意参谋】工具。2、在【生意参谋数据拷贝】中&#xff0c;点击【打开生意参谋】按钮。3、在调用的IE浏览器中输入账号和密码。4、登陆好后&#xff0c;找到竞品&#xff0c;并点击【查看详情】。5、进入到竞品详情后&#xff0c;注意修改日…

c mysql 视图_MySQL入门教程(七)之视图

相关阅读&#xff1a;视图是从一个或多个表中导出来的虚拟表。视图就像一个窗口&#xff0c;通过这个窗口可以看到系统专门提供的数据。1、视图简介1.1 视图的含义视图是从一个或多个表中导出来的虚拟表&#xff0c;还可以从已经存在的视图的基础上定义。数据库中只存放视图的定…

tensorflow gpu安装_tensorflow-gpu安装配置

1 介绍目前&#xff0c;主流版本是tensorflow-gpu 1.12.0&#xff0c;线上安装这个版本&#xff0c;和这个版本搭配的cuda是9.0版本&#xff0c;cudnn版本是7.0.5。2 cuda和cudnn安装cuda驱动地址&#xff1a;cuda_9.0.176_384.81_linux.runcudnn库地址: cudnn-9.0-linux-x64-v…

hibernate mysql autocommit_Hibernate4 中为什么我没有用commit()方法直接用save就存到数据库了?...

求大神讲解下Hibernate4 中为什么我没有用commit()方法直接用save就存到数据库了&#xff1f;public class Main {public static void main(String[] args) {SessionFactory sessionFactory new Configuration().configure().buildSessionFactory();Student student new Stud…

java ee文件下载_JavaEE实现文件下载

我们先来看一个最简单的文件下载的例子&#xff1a;package com.yyz.response;import java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.…

python输出jpg_利用python实现.dcm格式图像转为.jpg格式

如下所示&#xff1a;import pydicomimport matplotlib.pyplot as pltimport scipy.miscimport pandas as pdimport numpy as npimport osdef Dcm2jpg(file_path):#获取所有图片名称c []names os.listdir(file_path) #路径#将文件夹中的文件名称与后边的 .dcm分开for name in…

java联合主键_hibernate联合主键映射(注解版)

1、联合主键的映射三种写法实体类&#xff1a;package com.zhouwei.po;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.IdClass;import javax.persistence.Table;//联合主键(通过id和name确定一个人)EntityTable(name"t_person&q…

python 如何边改代码边调试_Python 代码调试神器:PySnooper

给大家推荐本我自己写的电子书《PyCharm中文指南》&#xff0c;把各种 PyCharm 的高效的使用技巧用GIF动态图的形式展示出来。有兴趣的可以看它的在线文档&#xff1a;http://pycharm.iswbm.com对于每个程序开发者来说&#xff0c;调试几乎是必备技能。代码写到一半卡住了&…

python 代理服务器_Python实现HTTP代理服务器

这些天闲来无事就研究了下HTTP代理原理&#xff0c;顺便用Python做了个很挫的程序。import socketimport threadingclass ProxyServer():def __init__(self):self.ListenSock socket()self.ListenSock.bind()self.Clients []def listen_thread(self):self.ListenSock.listen(…

java 如何导出json文件_java导出json格式文件的示例代码

本文介绍了java导出json格式文件的示例代码&#xff0c;分享给大家&#xff0c;具体如下&#xff1a;import java.io.File;import java.io.FileWriter;import java.io.Writer;public class CreateFileUtil {/*** 生成.json格式文件*/public static boolean createJsonFile(Stri…

python执行shell命令、并获取执行过程信息_python执行使用shell命令方法

1. os.system(shell_command)直接在终端输出执行结果&#xff0c;返回执行状态0,1此函数会启动子进程&#xff0c;在子进程中执行command&#xff0c;并返回command命令执行完毕后的退出状态&#xff0c;如果command有执行内容&#xff0c;会在标准输出显示。这实际上是使用C标…

java安全框架有哪些_Java开发必备教程-细说Spring Security安全框架

一、Spring Security介绍spring security 是基于 spring 的安全框架。它提供全面的安全性解决方案&#xff0c;同时在 Web 请求级和方法调用级处理身份确认和授权。在 Spring Framework 基础上&#xff0c;spring security 充分利用了依赖注入(DI)和面向切面编程(AOP)功能&…

无法读取源文件或磁盘_raid磁盘阵列作用

磁盘阵列的作用&#xff1a;1.提高传输速率。RAID通过在多个磁盘上同时存储和读取数据来大幅提高存储系统的数据吞吐量(Throughput)。在RAID中&#xff0c;可以让很多磁盘驱动器同时传输数据&#xff0c;而这些磁盘驱动器在逻辑上又是一个磁盘驱动器&#xff0c;所以使用RAID可…

java none怎么用tomcat_JavaWeb学习——在Eclipse里使用Tomcat

JavaWeb学习——在Eclipse里使用Tomcat摘要&#xff1a;本文主要学习了如何在Eclipse里使用Tomcat服务器。添加Tomcat打开Eclipse的配置页面&#xff0c;点击菜单上的“Window”&#xff0c;在下拉菜单中找到“Preferences”&#xff1a;找到运行环境的配置页面&#xff0c;如果…

mysql b 树原因_复习系列之数据库(四):MySQL为什么采用B+树作为索引结构?

MySQL中数据是索引组织表&#xff0c;即表中数据按照主键顺序存放。所以就可以基于索引这种数据结构实现一些高级算法&#xff0c;来提高检索效率。常见的查找算法顺序查找&#xff1a;复杂度O(n)&#xff0c;在数据量大时&#xff0c;效率很低二分查找&#xff1a;在有序为前提…

关于python类_python中类的总结

1、 类中的方法在类里主要有三种方法&#xff1a;a、普通方法&#xff1a;在普通方法定义的时候&#xff0c;需要一个对象的实例参数&#xff0c;从而在类中定义普通方法的时候&#xff0c;都必须传送一个参数self&#xff0c;那么这个参数也就是objectb、类方法&#xff1a;在…

折线图 java_java报表折线图

package com.potevio.rnd.tobacco.mine;import java.util.Map;/*** description 数据BEAN* author Zhou-Jingxian*/public class Bean {private String goods_name ;private Map priceindexMap;public String getGoods_name() {return goods_name;}public void setGoods_name(S…

windows无法检索有关这台计算机上的磁盘信息_磁盘镜像软件OO DiskImage Pro 15.5介绍及安装教程...

Active Disk Image是一种磁盘映像软件&#xff0c;可以精确复制任何PC磁盘(HDD&#xff0c;SSD&#xff0c;USB&#xff0c;CD&#xff0c;DVD&#xff0c;Blu-ray等)并将其存储在文件夹中。磁盘映像可用于备份&#xff0c;PC升级或磁盘复制。万一计算机出现故障&#xff0c;可…