java - 如何使用 JavaFx 删除图像的颜色(使背景透明)?

标签 java image javafx background transparency

我用 ImageImageView 加载了一张图片。

我想使白色透明的图像背景与背景相匹配。

最佳答案

查看 Reduce number of colors and get color of a single pixel 中使用的 PixelWriter 和 WritableImage 的重采样技术.您可以使用相同的技术并将白色像素 (rgb 255,255,255) 更改为透明 (rgba 0,0,0,0)。

你也可以这样做in an image editing program在您的应用程序中使用图像之前。

这是使用来自 Easily Remove White Or Black Backgrounds with Blending Sliders in Photoshop 的图像的示例.

一个简单的重采样实现如下所示:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class XRayVision extends Application {
    private static final int TOLERANCE_THRESHOLD = 0xFF;
    private static final String BACKGROUND_IMAGE_LOC = 
            "http://imgs.abduzeedo.com/files/articles/20_beautiful_landscape_wallpapers/landscape-wallpaper-1.jpg";
    private static final String ORIGINAL_IMAGE_LOC = 
            "http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2011/01/toy.jpg";

    private Image makeTransparent(Image inputImage) {
        int W = (int) inputImage.getWidth();
        int H = (int) inputImage.getHeight();
        WritableImage outputImage = new WritableImage(W, H);
        PixelReader reader = inputImage.getPixelReader();
        PixelWriter writer = outputImage.getPixelWriter();
        for (int y = 0; y < H; y++) {
            for (int x = 0; x < W; x++) {
                int argb = reader.getArgb(x, y);

                int r = (argb >> 16) & 0xFF;
                int g = (argb >> 8) & 0xFF;
                int b = argb & 0xFF;

                if (r >= TOLERANCE_THRESHOLD 
                        && g >= TOLERANCE_THRESHOLD 
                        && b >= TOLERANCE_THRESHOLD) {
                    argb &= 0x00FFFFFF;
                }

                writer.setArgb(x, y, argb);
            }
        }

        return outputImage;
    }

    @Override
    public void start(final Stage stage) throws Exception {
        final Image backgroundImage = new Image(BACKGROUND_IMAGE_LOC);
        final ImageView backgroundImageView = new ImageView(backgroundImage);
        final Image originalImage = new Image(ORIGINAL_IMAGE_LOC);
        final ImageView originalImageView = new ImageView(originalImage);
        final Image resampledImage = makeTransparent(originalImage);
        final ImageView resampledImageView = new ImageView(resampledImage);

        final HBox images = new HBox(originalImageView, resampledImageView);
        stage.getIcons().add(originalImage);

        final StackPane layout = new StackPane(backgroundImageView, images);
        stage.setScene(new Scene(layout));
        stage.show();
    }

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

当 TOLERANCE_THRESHOLD 设置为 0xFF 时,只有纯白色像素点会变为透明,得到如下图像。字符周围的白色部分是因为某些背景不是完全白色而是略带灰色,因此重采样不会修改它的 alpha 值。

low tolerance

将 TOLERANCE_THRESHOLD 减小到 0xCF 会产生如下图所示的图像,其中一些浅灰色背景变得透明。请注意,此结果并不完美,因为角色周围仍然存在灰色锯齿轮廓,并且角色的白色 Helm 变得透明。您可以将算法修改得更智能,更像 lasso tool。一个图像绘制应用程序,然而,这可能会变得棘手,并且在没有人参与的情况下仍然可能出错。如果上面概述的简单程序例程不足以按照您的喜好正确地重新采样图像,那么您最好提前在图像编辑程序中设置透明度(这是我在大多数情况下推荐的方法) ).

high tolerance

关于java - 如何使用 JavaFx 删除图像的颜色(使背景透明)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35905882/

相关文章:

java - 如何在仅在单个数组中的 java 中打印多态对象

java - PrintWriter在写入时删除txt文件的旧内容

ios - iOS-如何正确缩放具有不同图像大小的UIButton(例如Facebook News Feed)?

JavaFX JDK 9.0.4 ListView celFactory 添加空单元格

java - 如何从 .NET 通过 Azure Servicebus 发送 javax.jms.TextMessage

java - 有没有办法确定Java类中的方法是否已被覆盖

image - 如何打开 HEIF (.heic) 图像?

java - 如何更改 slick2d 左上角图标

css - JavaFx PieChart 边界颜色

java - 在 JavaFX 中获取屏幕上路径的 x y 坐标