What you are Doing Wrong

差异运算符不是基于是否设置像素而不是RGB分量的差异的二进制差异,因此代替实心红色叠加,您将获得多色叠加,因为RGB组件的差异混合图像在像素之间不同 .

Background

您正在尝试使用混合模式执行与masked bit-blit operation类似的操作(基本上是OR,然后是基于黑色蒙版上的白色的像素数据的AND) . JavaFX 8中的内置混合可能有点棘手 .

您可以在混合API中为bit-blt样式基础创建一个功能请求,以及公开Swing has这样的完整porter duff compositing实现,以便底层混合引擎具有更强大的功能,并且可能更容易使用 .

Alternatives

首选的方法是在像photoshop这样的图像编辑器中预处理你的蒙版,将黑色部分转换为alpha通道 - 然后你可以将你的蒙版层叠在原始图像上,默认的合成模式将采用它 .

要使支持alpha的蒙版成为红色,您可以使用 mask.setBlendMode(BlendMode.RED) (或者您可以在图像编辑器中对蒙版进行预着色,然后再在程序中使用它) .

另一种选择是您在问题中使用的PixelReader解决方案(如果您无法预先将掩码转换为使用alpha,我认为这很好) .

混合操作可以在适当的硬件上进行硬件加速 . 因此,如果您经常使用混合可能会更快(但是您必须在大图像上快速运行许多混合才能真正注意到任何类型的性能差异) .

Sample Solution Using Blend Operations

样本输出

输入图像

original.jpg

stencil.jpg

import javafx.application.Application;

import javafx.geometry.Insets;

import javafx.scene.*;

import javafx.scene.effect.BlendMode;

import javafx.scene.image.*;

import javafx.scene.layout.HBox;

import javafx.scene.paint.Color;

import javafx.scene.shape.Rectangle;

import javafx.stage.Stage;

public class Blended extends Application {

@Override

public void start(Stage stage) {

Image original = new Image(

getClass().getResourceAsStream("original.jpg")

);

Image stencil = new Image(

getClass().getResourceAsStream("stencil.jpg")

);

// first invert the stencil so that it is black on white rather than white on black.

Rectangle whiteRect = new Rectangle(stencil.getWidth(), stencil.getHeight());

whiteRect.setFill(Color.WHITE);

whiteRect.setBlendMode(BlendMode.DIFFERENCE);

Group inverted = new Group(

new ImageView(stencil),

whiteRect

);

// overlay the black portions of the inverted mask onto the image.

inverted.setBlendMode(BlendMode.MULTIPLY);

Group overlaidBlack = new Group(

new ImageView(original),

inverted

);

// create a new mask with a red tint (red on black).

Rectangle redRect = new Rectangle(stencil.getWidth(), stencil.getHeight());

redRect.setFill(Color.RED);

redRect.setBlendMode(BlendMode.MULTIPLY);

Group redStencil = new Group(

new ImageView(stencil),

redRect

);

// overlay the red mask on to the image.

redStencil.setBlendMode(BlendMode.ADD);

Group overlaidRed = new Group(

overlaidBlack,

redStencil

);

// display the original, composite image and stencil.

HBox layout = new HBox(10);

layout.getChildren().addAll(

new ImageView(original),

overlaidRed,

new ImageView(stencil)

);

layout.setPadding(new Insets(10));

stage.setScene(new Scene(layout));

stage.show();

}

public static void main(String[] args) {

launch();

}

}

java图片蒙版,在javafx中创建图像叠加蒙版相关推荐

  1. JavaFX官方教程(五)之在JavaFX中创建表单

    翻译自  在JavaFX中创建表单 在开发应用程序时,创建表单是一项常见活动.本教程将向您介绍屏幕布局的基础知识,如何将控件添加到布局窗格以及如何创建输入事件. 在本教程中,您将使用JavaFX构建如 ...

  2. [OpenCV] 练习题实现代码 使用 cv.addWeighted 函数在文件夹中创建图像的幻灯片放映,并在图像之间进行平滑过渡

    1.问题背景 opencv 官方手册 文档 练习题 练习题实现代码 使用 cv.addWeighted 函数在文件夹中创建图像的幻灯片放映,并在图像之间进行平滑过渡 2.代码部分 按任意键切换幻灯片 ...

  3. Java:在网络路径中创建文件

    应用场景 使用Java语言在网络路径中创建文件. 实现 本地路径 首先在本地路径中创建文件的代码是这样的. import java.io.*; import java.text.CompactNumb ...

  4. ae 创建图像等高线 蒙版_「PS软件」工具使用,图层蒙版与橡皮擦的应用分析

    在很多的PS教程中,都会提到"使用图层蒙版或者其他工具删除部分图案".作为PS初学者,大多数选择使用橡皮擦工具,因为橡皮擦工具相对简单点,而图层蒙版听起来相对生涩高深. 事实上,图 ...

  5. ae 创建图像等高线 蒙版_如何用AE创建简单的UI动效

    工具 After Effects CS6 or CC Photoshop CS6 or CC 设计流程 After Effects 在一个合成中创建转场效果 另外一个合成中创建展示效果 导出 Phot ...

  6. CAD编辑指南6:CAD导入图片和在CAD中创建表格

    专门从事建筑.计算机和机械等与图纸设计相关的人就需要用到CAD编辑器,用它来实现CAD图纸的格式转换和图纸的修改与编辑.市面上的CAD编辑器五花八门,但是真正好用的却很少.在这里,我给大家推荐一个操作 ...

  7. html怎么把图片放到数组,HTML5中的图像数组

    所以,如果我想在网上抓取几张图片,将它们放入一个数组中并在网站上使用它们,我正在使用Javascript怎么做.HTML5中的图像数组 var images = [ {caption: "R ...

  8. HTML5 Canvas中创建图像数据

    创建图像数据 如果想预先生成一组空的canvas数据,则可调用context.createImageData(sw, sh),这个函数可以创建一组图像数据并绑定在canvas对象上.这组数据可以像先前 ...

  9. Java学习笔记:Word中创建图表如此简单

    用法 Word中创建图表的方式是一样的. XWPFChart chart = WordHelpers.createChart(doc,500,300); XWPFChart和XSSFChart一样都是 ...

  10. 「开发小技巧」07—如何使用HTML和CSS创建图像叠加图标?

    使用图像覆盖图标可以为你的网站交互细节或一组功能加深印象.本文内容将分为两部分,第一部分创建结构并附加图标的链接.在第二部分中,我们将使用CSS进行设计. 创建结构:在本节中,我们将创建一个基本结构, ...

最新文章

  1. 使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)
  2. .Net Core 环境安装
  3. 线上故障如何快速排查?来看这套技巧大全
  4. 初识德国的小朋友兴趣课程
  5. linux tail命令_操作手册
  6. awk的常用内置函数的使用【转】
  7. 苹果又发布一个机器学习框架,帮自家生态里的开发者降低AI门槛
  8. 对我来说,只有一件事情是重要的
  9. spark开发环境配置
  10. 最新修复版efucms聚合小说漫画动漫听书分销系统源码(附安装教程)
  11. 微信附近的人小程序怎么开(开通附近小程序的方法)
  12. 海康大华ie插件开发
  13. java转码mp4的代码_JAVA视频格式转换 avi转mp4
  14. c语言中函数已有主体,error C2084 函数已有主体(Function already has a body)解决方案...
  15. 揭开手机app中摇一摇的神秘面纱
  16. python贷款_python算账,贷款表
  17. NUMA为何成为云计算的关键技术
  18. Servlet的执行原理
  19. 深度学习细粒度图像研究汇总
  20. HTML5期末大作业:体育网页设计——篮球专题6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计

热门文章

  1. 一文掌握 Java8 Stream 中 Collectors 的 24 个操作
  2. react兼容safari9_react项目兼容ie浏览器配置
  3. Cookie、Session的使用及区别
  4. 开发网页微信登入获取微信用户信息
  5. 利用栈实现对后缀表达式(逆波兰表达式)的求解(C代码实现)
  6. 深入理解什么是端口(port)
  7. 实时AAC音频/本地AAC音视频硬解码详细介绍附带Demo
  8. 查询结果按中文拼音顺序排序
  9. c语言输出26个小写英文字母,c语言题。 按顺序打印输出26个英文字母,
  10. 编译原理中单线箭头->和双线箭头=>有什么区别