【问题标题】:How to delete a color of an image with JavaFx (make the background transparent)?如何使用 JavaFx 删除图像的颜色(使背景透明)?
【发布时间】:2016-06-24 16:06:46
【问题描述】:

我的图片加载了ImageImageView

我想让图片的背景,白色,透明,与背景相匹配。

【问题讨论】:

  • @jewelsea:你有什么理由不写这个作为答案?我只是浪费时间阅读所有内容,却发现您已经将答案作为评论提供。我正要写和答案一样的东西,但现在如果我写它,就好像在偷你:-(
  • Aww shucks,sry Roland,我会回答的。

标签: java image javafx background transparency


【解决方案1】:

请参阅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 值。

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

【讨论】:

  • 为什么要减少颜色数量?
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2017-02-27
  • 2017-08-11
  • 1970-01-01
  • 2017-10-13
相关资源
最近更新 更多