Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaFx删除图像的颜色(使背景透明)?_Java_Image_Javafx_Background_Transparency - Fatal编程技术网

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

如何使用JavaFx删除图像的颜色(使背景透明)?,java,image,javafx,background,transparency,Java,Image,Javafx,Background,Transparency,我有一个加载了image和ImageView的图像 我想使图像的背景为白色,透明,以便与背景匹配。请参阅中使用的PixelWriter和WritableImage的重采样技术。可以使用相同的技术将白色像素(rgb 255255)更改为透明(rgba 0,0,0,0) 您也可以在应用程序中使用映像之前执行此操作 下面是一个使用来自的图像的示例 下面显示了一个简单的重采样实现: import javafx.application.Application; import javafx.scene.Sc

我有一个加载了
image
ImageView
的图像


我想使图像的背景为白色,透明,以便与背景匹配。

请参阅中使用的PixelWriter和WritableImage的重采样技术。可以使用相同的技术将白色像素(rgb 255255)更改为透明(rgba 0,0,0,0)

您也可以在应用程序中使用映像之前执行此操作

下面是一个使用来自的图像的示例

下面显示了一个简单的重采样实现:

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);
    }
}
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.image.*;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共级X光透视扩展应用{
专用静态最终整数容差_阈值=0xFF;
私有静态最终字符串背景\图像\位置=
"http://imgs.abduzeedo.com/files/articles/20_beautiful_landscape_wallpapers/landscape-wallpaper-1.jpg";
私有静态最终字符串原始图像位置=
"http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2011/01/toy.jpg";
私有映像透明化(映像输入映像){
int W=(int)inputImage.getWidth();
inth=(int)inputImage.getHeight();
WritableImage outputImage=新的可写映像(W,H);
PixelReader=inputImage.getPixelReader();
PixelWriter writer=outputImage.getPixelWriter();
对于(int y=0;y>16)和0xFF;
int g=(argb>>8)&0xFF;
int b=argb&0xFF;
如果(r>=公差\u阈值
&&g>=公差\u阈值
&&b>=公差(U阈值){
argb&=0x00FFFFFF;
}
writer.setArgb(x,y,argb);
}
}
返回输出图像;
}
@凌驾
public void start(final Stage)引发异常{
最终图像背景图像=新图像(背景图像位置);
最终图像视图backgroundImageView=新图像视图(backgroundImage);
最终图像原始图像=新图像(原始图像);
最终图像视图originalImageView=新图像视图(originalImage);
最终图像重采样图像=使透明(原始图像);
最终图像视图重采样图像视图=新图像视图(重采样图像);
最终HBox图像=新HBox(原始图像视图、重采样图像视图);
stage.getIcons().add(originalImage);
最终StackPane布局=新StackPane(backgroundImageView,图像);
舞台场景(新场景(布局));
stage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
当TOLERANCE_THRESHOLD设置为0xFF时,只有纯白色像素将更改为透明,您得到的图像如下所示。角色周围的白色部分是因为某些背景不是完全白色,而是略微灰色,因此重采样不会修改其alpha值

将容差_阈值降低到0xCF将生成如下图像,其中一些浅灰色背景变为透明。请注意,此结果并不完美,因为角色周围仍有锯齿状的灰色轮廓,并且角色的白色头盔变得透明。您可以修改算法,使其更加智能,并使其更像图像绘制应用程序的应用程序,但这可能会变得棘手,并且在没有人工参与的情况下仍可能出错。如果上面概述的过于简单的编程例程不足以按照您的喜好对图像进行正确的重新采样,那么最好在图像编辑程序中提前设置透明度(这是我在任何情况下都会建议的)


请参阅中使用的PixelWriter和WritableImage的重采样技术。可以使用相同的技术将白色像素(rgb 255255)更改为透明(rgba 0,0,0,0)

您也可以在应用程序中使用映像之前执行此操作

下面是一个使用来自的图像的示例

下面显示了一个简单的重采样实现:

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);
    }
}
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.image.*;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共级X光透视扩展应用{
专用静态最终整数容差_阈值=0xFF;
私有静态最终字符串背景\图像\位置=
"http://imgs.abduzeedo.com/files/articles/20_beautiful_landscape_wallpapers/landscape-wallpaper-1.jpg";
私有静态最终字符串原始图像位置=
"http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2011/01/toy.jpg";
私有映像透明化(映像输入映像){
int W=(int)inputImage.getWidth();
inth=(int)inputImage.getHeight();
WritableImage outputImage=新的可写映像(W,H);
PixelReader=inputImage.getPixelReader();
PixelWriter writer=outputImage.getPixelWriter();
对于(int y=0;y>16)和0xFF;
int g=(argb>>8)&0xFF;
int b=argb&0xFF;
如果(r>=公差\u阈值
&&g>=公差\u阈值
&&b>=公差(U阈值){
argb&=0x00FFFFFF;
}
writer.setArgb(x,y,argb);
}
}
返回输出图像;