`
jxxms
  • 浏览: 106949 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Swing图片对象到SWT图片对象的转换(透明效果保持)

    博客分类:
  • SWT
阅读更多

站在巨人的肩膀上才能看得更远。因此在SWT应用开发中,我们希望继承现有的基于Swing的丰富代码。转移过程需要的关注点不少,其中图片对象的转换必不可少。Swing的Image对象与SWT的Image对象不尽相同,但转换的办法还是有的。我参考过网上的一些实现代码,但是图标的透明处理效果总留遗憾。转换后,原本透明的部分变成了黑色,很是扎眼。我对相关代码进行了修改,解决了这一困扰。一点经验,与大家分享。
透明的实现关键是SWT ImageData对象的transparentPixel属性设置。它将特定的色素指定为透明。下面是完整的程序代码:
package com.example.draw;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.DirectColorModel;
import java.awt.image.ImageObserver;
import java.awt.image.WritableRaster;

import javax.swing.ImageIcon;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

/**
 *
 * Change javax.swing.ImageIcon object to org.eclipse.swt.graphics.Image object.
 *
 * @author Freshwind
 */
public class ImageConvertor {

    public ImageConvertor() {
        super();
    }

    /**
     * change ImageIcon to BufferedImage
     *
     * @param icon
     * @return
     */
    public static BufferedImage getBufferedImage(ImageIcon icon) {
        int width = icon.getIconWidth();
        int height = icon.getIconHeight();
        ImageObserver observer = icon.getImageObserver();
        BufferedImage bufferedImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics gc = bufferedImage.createGraphics();
        gc.drawImage(icon.getImage(), 0, 0, observer);
        return bufferedImage;
    }

    /**
     * change BufferedImage to ImageData
     *
     * @param bufferedImage
     * @return
     */
    public static ImageData getImageData(BufferedImage bufferedImage) {
        DirectColorModel colorModel = (DirectColorModel) bufferedImage
                .getColorModel();
        PaletteData palette = new PaletteData(colorModel.getRedMask(),
                colorModel.getGreenMask(), colorModel.getBlueMask());
        ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage
                .getHeight(), colorModel.getPixelSize(), palette);
        int whitePixel = data.palette.getPixel(new RGB(255, 255, 255));    //将白色设定为透明色
        WritableRaster raster = bufferedImage.getRaster();
        int[] pixelArray = new int[3];
        for (int y = 0; y < data.height; y++) {
            for (int x = 0; x < data.width; x++) {
                raster.getPixel(x, y, pixelArray);
                int pixel = palette.getPixel(new RGB(pixelArray[0],
                        pixelArray[1], pixelArray[2]));
                if (pixel == 0)                        //Swing读取PNG图形文件,透明的色素被置为0,所以格式转换是,将它变为白色(之前定义的透明色素)。
                    data.setPixel(x, y, whitePixel);
                else
                    data.setPixel(x, y, pixel);
            }
        }
        data.transparentPixel = whitePixel;        //将白色指定为透明色素(同理将其它颜色定为透明色素也是可行的)。
        return data;
    }

    public static void main(String[] args) {
        ImageIcon icon = new ImageIcon(
                "E:\\mypic\\picture.png");
        BufferedImage bufferedImage = getBufferedImage(icon);
        ImageData data = getImageData(bufferedImage);

        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Image Convertor");
        shell.setLayout(new FillLayout());
        shell.setBackground(new Color(display, new RGB(255, 255, 255)));
        shell.setSize(350, 100);

        Label label = new Label(shell, SWT.NONE);
        // new Image with ImageData which is generated previously.
        Image image = new Image(display, data);
        label.setImage(image);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}

分享到:
评论

相关推荐

    在SWING、SWT中嵌入浏览器

    总之,“在SWING、SWT中嵌入浏览器”涉及到对Java GUI库的深入理解,以及如何利用这些库与Web技术进行集成。无论是SWING还是SWT,都有其独特的方法和挑战,开发者需要根据项目需求和目标平台选择合适的方法。

    swt源码和jar包dj-native-swing-swt.jar

    在标题提到的"swt源码和jar包dj-native-swing-swt.jar"中,"dj-native-swing-swt.jar"是一个特殊的库,它结合了SWT和JNativeSwing,允许在Java Swing应用中嵌入SWT组件。这使得开发者可以在同一应用程序中同时使用...

    开发项目用SWING与RCP与SWT.JFACE的分析

    ### 开发项目用SWING与RCP与SWT.JFACE的分析 #### 一、SWT简介 SWT(Standard Widget Toolkit)作为一种图形用户界面工具包,为Java开发者提供了创建高性能且外观统一的桌面应用程序的能力。相较于传统的AWT和...

    swing2swt包

    swing2swt java应用开发包,貌似现在很少了

    Swing Designer SWT

    SWT Designer还支持布局管理器,例如GridLayout、 MigLayout 和 GroupLayout,这些布局管理器可以帮助组织和对齐组件,确保界面在不同屏幕尺寸下都能保持良好的显示效果。此外,SWT Designer还提供了事件处理的可视...

    java Swing、SWT分页

    Java Swing和 SWT 是两种在Java中创建图形用户界面(GUI)的库,它们都提供了丰富的组件和工具来构建桌面应用程序。在这篇文章中,我们将深入探讨Java Swing中的分页技术和SWT(Standard Widget Toolkit)的使用,...

    swt swing awt的区别

    swt swing awt的区别

    java swing创建透明图片

    网上很多关于Java创建透明图片的例子,但我试过之后都不好使。这个短短几行代码,就可以实现,只是一个方法,直接调用就可以。

    关于swing和swt的小练习

    在Java编程领域,Swing和SWT(Standard Widget Toolkit)是两种主要的GUI(图形用户界面)工具包,用于创建桌面应用程序。这个“关于swing和swt的小练习”压缩包文件提供了一些实际的代码示例,帮助开发者深入理解这...

    Java Swing to SWT.pdf

    ### Java Swing 迁移到 SWT 的相关知识点 #### 1. 关于本教程 - **教程简介**:本教程旨在帮助开发者了解如何将基于 Java Swing 的应用程序迁移到 SWT(Standard Widget Toolkit)。自2001年首次发布并捐赠给开源...

    在eclipse下搭建swing/awt/swt开发环境的方法和插件

    在Java编程领域,Swing、AWT和SWT都是用于构建图形用户界面(GUI)的框架。本篇文章将详细介绍如何在Eclipse集成开发环境中(IDE)搭建这些框架的开发环境,以及可以使用的相关插件。 首先,让我们从AWT(Abstract ...

    浅析Java中Swing与SWT和AWT的区别及实现_王亚南

    Java是一种广泛使用的编程语言,在图形用户界面(GUI)设计领域提供了多种开发包,其中比较著名的有Swing、SWT和AWT。这三种技术各有特点和适用场景,在开发Java图形界面应用时,开发者需要根据实际需求选择最合适的...

    java Swing读取图片

    当我们需要在Swing应用中展示图片时,可以利用特定的方法来读取并显示图像。本篇文章将详细讲解如何在Java Swing中读取和显示图片,以及与之相关的知识点。 首先,我们需要了解Java中的图像处理类。`java.awt.Image...

    swing和swt

    Swing组件可以拥有透明背景,支持非矩形形状,而且更容易进行自定义和扩展。 **轻量构件**是Swing的一个关键特性,它们直接继承自Component或Container类,没有同位体,而是嵌套在重量级容器(如JFrame或JApplet)...

    swing to swt

    迁移Swing代码到SWT的过程中,有一些基本步骤可以帮助减少工作量并确保转换过程尽可能平滑: 1. **评估Swing应用程序的现状**:了解当前Swing应用的结构和功能需求,确定哪些部分可以直接迁移,哪些部分需要重构。 ...

    eclipse swing/SWT插件

    在Java桌面应用开发领域,Swing和SWT(Standard Widget Toolkit)是两个常用的库,用于创建用户界面。本篇文章将深入探讨Eclipse中的Swing和SWT插件,特别是jigloo插件。 Swing是Java Foundation Classes (JFC)的一...

    Eclipse Swing Swt builder 插件安装包及安装说明

    Eclipse Swing SWT Builder插件就是专门针对这两个库设计的,它极大地简化了Swing和SWT组件的设计和布局工作。 Swing是Java的标准GUI库,基于Java AWT(抽象窗口工具包)并扩展了它,提供了更多的组件和更现代的...

    java Swing电子相册管理系统 面向对象思想

    例如,可以使用ArrayList来存储图片对象,HashMap来关联图片与元数据。 7. **异常处理**:在进行文件操作和网络通信时,可能会遇到异常情况。通过try-catch语句块捕获和处理异常,可以确保程序的稳定性和用户体验。...

    java swing程序 实现点击图片列表 改变图片

    这种布局非常适合用来实现“卡片切换”的效果,就像在这个程序中,每次点击`JComboBox`的选项时,都会像翻卡片一样显示新的图片。使用`CardLayout`需要添加组件到一个容器(如JPanel),并为每个组件分配一个唯一的...

    DJNativeSwing-SWT有关的所有jar,java将HTML页面转为图片

    标题中的"DJNativeSwing-SWT有关的所有jar,java将HTML页面转为图片"涉及到的是一个Java库,DJNativeSwing-SWT,它允许...正确理解和使用这个库,可以帮助开发者在各种场景下实现高效、高质量的HTML到图片的转换。

Global site tag (gtag.js) - Google Analytics