如何将图像转换为灰度而不丢失透明度?

2023-12-10

我在将带有一些透明像素的彩色图像转换为灰度时遇到问题。我已经在该网站上搜索并找到了相关问题,但我无法用来解决我的问题。

我定义了一个方法“convertType”,如下所示:

/*------------------------------
attempts to convert the type of the image argument to the chosen type
for example: BufferedImage newImage= ImageUtilities.convertType(oldImage, BufferedImage.TYPE_3BYTE_BGR);
11/28/2013 WARNING-it remains to be seen how well this method will work for various type conversions
------------------------------*/
public static BufferedImage convertType (BufferedImage image,int newType){
 if (image.getType() == newType){
   return (image);
 }else {
    int w= image.getWidth();
    int h= image.getHeight ();
    BufferedImage modifiedImage = new BufferedImage( w,h,newType);
    Graphics2D g = ( Graphics2D)modifiedImage.getGraphics();
    g.drawImage( image, null, 0,0);
    g.dispose();
    return (modifiedImage);
}
}

我从 BufferedImage 类型开始TYPE_4BYTE_ABGR命名为“结果”,然后:

 result= convertType (result, BufferedImage.TYPE_BYTE_GRAY);//transparency is lost
 result=convertType (result, BufferedImage.TYPE_INT_ARGB);//pixels will now support transparency

对于原始图像中的彩色不透明像素,上述序列工作正常: 例如,(32, 51, 81, 255)-> (49, 49, 49, 255)

然而,原始图像中的透明像素变成不透明: 例如,(0, 0, 0, 0)-> (0, 0, 0, 255)

我明白发生了什么,如果我可以利用用于转换为灰度的 Java 算法,我就可以解决这个问题。我已经下载了源代码并四处查看,但无法找到该算法。如果有人可以:我将不胜感激:

  1. 告诉我哪个类包含灰度转换算法或
  2. 建议一种替代方法来完成我正在尝试做的事情。

您是否考虑过使用ColorConvertOp filter?

例如...

AlphaGray

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestAlphaGrayScale {

    public static void main(String[] args) {
        new TestAlphaGrayScale();
    }

    public TestAlphaGrayScale() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage master;
        private BufferedImage gray;

        public TestPane() {
            setBackground(Color.RED);
            try {
                master = ImageIO.read(new File("C:\\hold\\thumbnails\\Miho_Alpha.png"));
                gray = new BufferedImage(master.getWidth(), master.getHeight(), BufferedImage.TYPE_INT_ARGB);

                // Automatic converstion....
                ColorConvertOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
                op.filter(master, gray);

                setLayout(new GridLayout(1, 2));

                add(new JLabel(new ImageIcon(master)));
                add(new JLabel(new ImageIcon(gray)));
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将图像转换为灰度而不丢失透明度? 的相关文章

随机推荐

  • 如何使用“纯 DOM”在根标记处设置名称空间(xmlns)声明?

    错误 未捕获异常 DOMException 消息 命名空间错误 dom new DOMDocument 1 0 utf 8 root dom gt createElement MyRoot Hello root gt setAttribut
  • 如何在 Emacs Lisp 中使用 Slime 运行 Common Lisp 代码

    出于某种原因 我编写了一些 Common Lisp 代码来完成我想要的操作 我使用 QuickLisp 和 Slime 现在我希望能与Emacs Lisp集成 我尝试使用 slime slime eval region start end
  • 将上下文无关语法转换为正则表达式

    我目前正在查看 CFG 并看到答案 但我不确定他们是如何得到它的 他们是如何将其从 CFG 转换为正则表达式的 S gt aS bX a X gt aX bY a Y gt aY a answer R E gt a a ba a ba ba
  • 输入时清除 EditText 中的文本[重复]

    这个问题在这里已经有答案了 我正在尝试设置 onclicklistener 以便当我在 edittext 元素中单击时 它将清除其当前内容 这里有什么问题吗 当我编译此代码时 我收到强制退出和 ActivityManager Can t s
  • Watson 使用一个 API 代码进行响应

    我知道如果我想在对话中向 Watson 发送任何内容 我可以使用 var latestResponse Api getResponsePayload var context latestResponse context Api sendRe
  • 如何创造无限可数的Times?

    我希望能够将 Ruby 中的 Enumerable 对象扩展为星期一的无限列表 例如 所以它会产生 3月29日 4月5日 4月12日 等等 我如何在 Ruby 中实现这个 在 1 9 中 可能以前的版本使用backports 您可以轻松创建
  • DataGridView 仅包含数字单元格?

    我是 winforms 新手 我正在尝试将 DataGridView 的两列设置为仅数字 我不希望用户能够在单元格中键入任何内容 除非它在一列中是自然数 而在另一列中是数值 始终是一位小数 我认为这很简单 但即使在尝试了 stackover
  • 在 PHP 中显示数据库中的复选框值

    在数据库中我有一列 语言 有价值观的English Arabic Urdu分别 现在 我正在获取这些值并在复选框中显示这些值以进行更新 我必须检查该复选框是否与数据库值匹配 然后将其选中 否则取消选中 但我得到了错误的结果 下面的代码对于从
  • 泽西岛 2.32 IllegalArgumentException jersey.repackaged.org.objectweb.asm.ClassVisitor

    我正在尝试使用 Jersey 的 JSON bean 验证 但是在初始化 servlet 时发生错误 完整的堆栈跟踪 SEVERE Servlet init for servlet rest servlet threw exception
  • Android 4.x 方向与phonegap

    我有一个带有phonegap 1 3和jquerymobile 1 0的网络应用程序 它可以在除4 0之外的所有Android版本上运行良好 事实上 如果我改变方向 应用程序会强制关闭 没有错误 也没有 据我所知 logcat 错误 如果我
  • 如何在android中排序List

    List
  • 使用 writeLines 时避免文件末尾出现空行

    在 R 中 是否可以避免 writeLines 生成的文本文件末尾出现空行 如果没有 是否有其他方法可以从 R 中生成文本文件而末尾不带空行 没有空行 R 正确地 以以下方式结束每一行 n or r n 在 Windows 上 换句话说 文
  • C# 循环遍历文件夹直到找到正确的文件

    我正在运行一个批处理来更新我的 sql 表 我正在使用 Windows 调度程序来运行批处理文件 每天文件在不同的时间到达 有时它们在我的计划时间之后进入 因此当文件夹中的计划任务之前没有文件时 批处理文件不会运行 我想创建一个 C 程序
  • 将一个表中的类别附加到另一个 MySQL 中的条目

    我有一个数据库 它接受用户提交的数据 我想将这些条目分组到大约 10 个类别中的一个或多个类别中 例如 您将您的条目添加到我的网站 说这一切都与您的业务 汽车代客服务 有关 我为您提供机会将您的条目分类为任意 10 个固定类别 汽车 移动服
  • 如何制作对象的防御性副本?

    如何制作包含不可变对象中的可变字段的可变对象的防御性副本 class ImmutableObject private final MutableObject immutable field ImmutableObject MutableOb
  • 如何正确播种随机数生成器

    我正在尝试在 Go 中生成一个随机字符串 这是我到目前为止编写的代码 package main import bytes fmt math rand time func main fmt Println randomString 10 fu
  • 使用 JQuery 在第一个表行之后插入新表行

    我有一张桌子id table 然后第一行id headings 现在我需要在标题行之后直接插入一个新行 我使用下面的代码 headings after table prepend tr tr 但我想我在这里做错了什么 Maybe table
  • SQL查询获取指定范围内的所有数据

    我有一个包含三列的表 报价 id product id 和价格 offer id integer product id integer price decimal 我想触发一个 SQL 查询 它将返回某个价格范围内的报价数量 范围应为 0
  • 不适用于

    我有一个模板 其中
  • 如何将图像转换为灰度而不丢失透明度?

    我在将带有一些透明像素的彩色图像转换为灰度时遇到问题 我已经在该网站上搜索并找到了相关问题 但我无法用来解决我的问题 我定义了一个方法 convertType 如下所示 attempts to convert the type of the