`
263229365
  • 浏览: 472016 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java绘制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 < bufferedImage

      .getHeight(); j1++) {

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

       .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) << 24) | (rgb & 0x00ffffff);

      }

 

      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();

 

}

}

0
0
分享到:
评论
1 楼 bewithme 2018-10-01  
我把一个透明背景的PNG画到了另外一张图片上,为啥透明背景就变黑了,你的这个好像并没有解决啊。Graphics2D draw( png图片) 时,png图片的透明背景丢失了

相关推荐

    java对图片改变大小,png防止变黑,加圆角 圆角外透明

    本篇文章将深入探讨如何在Java中实现这些功能,特别是针对PNG格式的图片,因为PNG格式支持透明度,但在处理过程中可能会出现背景变黑的问题。 首先,我们需要引入Java的`java.awt`和`javax.imageio`包,它们提供了...

    解决java压缩图片透明背景变黑色的问题

    然而,处理带有透明背景的PNG图片时,可能会遇到一个常见的问题:压缩后的图片透明部分变为黑色。这个问题通常是由于不正确的图像类型设置或者在处理透明度时的不当操作造成的。本文将深入探讨如何解决Java压缩图片...

    java文字转图片

    在实际应用中,我们可能还需要处理更复杂的需求,比如调整文字的对齐方式、添加背景图片、处理多行文本等。这通常涉及到更多的`Graphics2D`方法,如`drawRect()`、`drawLine()`、`rotate()`等,以及对文本布局的理解...

    Android png透明图片转jpg时背景变黑的解决方法

    Android png透明图片转jpg时背景变黑的...Android png 透明图片转jpg 时背景变黑的问题可以通过复制 Bitmap 对象,创建白色图片,然后将原来的 Bitmap 绘制至上去来解决。我们希望这篇文章能够帮助大家解决类似的问题。

    解决canvas转base64/jpeg时透明区域变成黑色背景的方法

    然而,在处理具有透明度的PNG图片时,可能会遇到一个问题:当`canvas`将PNG转换为JPEG时,透明区域会变为黑色背景。这个问题主要是由于JPEG格式不支持透明度(即Alpha通道),因此在转换过程中,透明区域会被默认...

    9.png图片制作+去黑边软件集合

    在某些情况下,9.png图片在设计时可能会有不必要的黑色边框,这些边框在实际应用中可能会影响UI的美观。xUltimate-d9pc-x86软件可能提供了方便的工具,帮助开发者快速去除这些黑边,或者调整图像的边缘,使得9.png...

    Android的.9.png图片分析

    - **保持内容区域不变**:在设计`.9.png`图片时,确保重要的图像内容(如文字、图标)位于非拉伸区域,以防止拉伸时内容变形。 - **测试与调试**:Android Studio的布局预览器可以帮助你检查`.9.png`图片是否正确...

    java实现在图片中写字

    在Java编程语言中,实现将文字写入图片是一项常见的任务,尤其在图形用户界面(GUI)开发、数据可视化或图像处理应用中。本教程将详细解释如何使用Java来完成这一功能,主要涉及到Java的`java.awt`和`javax.imageio`...

    java 图片半透明特效

    例如,当我们绘制一张图片到画布上时,可以使用`AlphaComposite`来控制其透明度: ```java Graphics2D g2d = (Graphics2D) g; g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); // ...

    bmp 简易透明贴图,功能类似png

    开发者可能使用C++、C#、Java或Python等语言编写了读取BMP、处理像素并进行透明绘制的函数。通过阅读和理解这些代码,我们可以学习如何在不支持Alpha通道的BMP格式中实现透明效果。 总结来说,"bmp简易透明贴图"是...

    Android创建抗锯齿透明背景圆角图像.zip

    在Android应用开发中,创建具有抗锯齿效果和透明背景的圆角图像是一项常见的需求,尤其是在设计用户界面时。此项目源码提供了一个实例,帮助开发者理解和实现这一功能。下面我们将详细探讨相关知识点。 首先,我们...

    java生成中间带logo的二维码图片

    本文将详细解析如何利用Java代码生成这种特殊的二维码图片,包括所需的技术背景、具体实现方法以及注意事项。 ### 技术背景 #### 二维码(QR Code)简介 二维码,即Quick Response Code,是一种矩阵式二维条码,...

    绘制.9图神器

    在Android开发中,.9图(也称为9-patch)是一种特殊的图像格式,用于创建可拉伸和缩放的背景图,以适应不同尺寸的屏幕。这种技术对于UI设计至关重要,因为它允许开发者创建灵活的图形元素,而不必为每个设备尺寸制作...

    android .9图图片使用帮助文档

    Android平台中的".9图",全称为"Nine-Patch"图像,是一种特殊类型的PNG图片,用于解决在不同分辨率设备上控件拉伸时的图形失真问题。.9.png图片的使用能够确保图片在横向和纵向拉伸时保持原始图像的细节,如渐变和...

    点9图片的制作视频

    点9图片,也被称为.9patch图片,是Android系统中特有的一种图片资源格式,用于实现图片的自适应拉伸,以确保图片在不同尺寸和布局中都能保持内容的清晰和不失真。这种技术尤其适用于需要随内容变化而动态调整大小的...

    Java代码实现二维码生成与解析.pdf

    7. **绘制二维码**:遍历矩阵,根据布尔值填充黑色方块。 8. **保存图像**:将绘制好的二维码保存为PNG图像文件。 这里需要注意的是,代码中使用了`com.swetake.util.Qrcode`库,这是一个第三方库,可能需要单独...

    draw9patch

    - **背景**:特别是有渐变效果或者图案的背景,使用`.9.png`可以实现平滑拉伸,避免因图片拉伸导致的失真。 - **对话框**:对话框的阴影和边框也需要`.9.png`来保证拉伸的正确性。 - **自定义视图**:自定义的复杂...

    端午节-js和java相关动画

    接着设置颜色为黑色,使用 `drawString` 方法绘制祝福语。 - `DragonBoatFestivalAnimation` 类继承自 `JFrame`,设置了窗口标题、尺寸和关闭操作。创建了一个 `DragonBoatPanel` 对象,并将其添加到窗口中,最后...

    textview添加背景

    对于更复杂的自定义背景,如九宫格图片,可以使用`android:background="@drawable/nine_patch_image"`,其中nine_patch_image是9.png格式的图片,这种图片允许指定拉伸区域和不拉伸区域,适合做自适应大小的背景。...

Global site tag (gtag.js) - Google Analytics