请参阅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,但是这可能会变得很棘手,并且在没有人参与的情况下仍然可能会出错。如果上面概述的下面简单的程序例程不足以正确地重新采样您的图像,您最好提前在图像编辑程序中设置透明度(这是我在大多数情况下都会推荐的方法) )。