JavaFX 控件 ImageView

2023-10-31

ImageView

支持格式:
BMP GIF JPEG PNG

//加载图片
//如果设置了 requestedXXX 尺寸, ImageView中 设置 FitXXX 尺寸是基于requestedXXX 尺寸缩放
Image image = new Image(
        String url,
double requestedWidth,
double requestedHeight,
boolean preserveRatio,
boolean smooth,
boolean backgroundLoading);

Image image = new Image("https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png", 100, 100, true, true, true);
//显示图片
ImageView imageView = new ImageView(image);

保持长宽比

ImageView imageView = new ImageView(image);
imageView.setPreserveRatio(true);
imageView.setFitWidth(200);
imageView.setFitHeight(200);

获取尺寸

Image image = new Image("image/portrait.jpg");
ImageView imageView = new ImageView(image);
imageView.setPreserveRatio(true);

System.out.println(imageView.getFitHeight());//0.0
System.out.println(imageView.getFitWidth());//0.0
//获取没有设置尺寸时的实际尺寸
System.out.println(imageView.prefHeight(-1));//391.0
System.out.println(imageView.prefWidth(-1));//391.0

设置圆角

Image image = new Image("image/portrait.jpg");
ImageView imageView = new ImageView(image);
imageView.setPreserveRatio(true);
imageView.setFitWidth(200);

Rectangle rectangle = new Rectangle(imageView.prefWidth(-1), imageView.prefHeight(-1));
rectangle.setArcWidth(50);
rectangle.setArcHeight(50);
imageView.setClip(rectangle);

Viewport

Image image = new Image("image/portrait.jpg");
ImageView imageView = new ImageView(image);
imageView.setPreserveRatio(true);
imageView.setFitWidth(200);

Rectangle2D rectangle = new Rectangle2D(80, 0, 200, 200);
imageView.setViewport(rectangle);

获取像素 ARGB

PixelReader pixelReader = image.getPixelReader();
int argb = pixelReader.getArgb(66, 66);
int a = (argb >> 24) & 0xff;
int r = (argb >> 16) & 0xff;
int g = (argb >> 8) & 0xff;
int b = argb & 0xff;

PixelReader

Image image = new Image("image/portrait.jpg");
ImageView imageView = new ImageView(image);
imageView.setPreserveRatio(true);
imageView.setFitWidth(200);

PixelReader pixelReader = image.getPixelReader();
//获取某个像素 ARGB
int argb = pixelReader.getArgb(66, 66);
int a = (argb >> 24) & 0xff;
int r = (argb >> 16) & 0xff;
int g = (argb >> 8) & 0xff;
int b = argb & 0xff;

//a = 255, r = 43, g = 43, b = 41
System.out.println("a = " + a + ", r = " + r + ", g = " + g + ", b = " + b);

//获取Color对象
Color color = pixelReader.getColor(100, 120);
//0xe74143ff
System.out.println(color.toString());

Label label = new Label("Label");
label.setTextFill(Paint.valueOf("#" + color.toString().substring(2, 8)));

WritableImage

按像素写入

WritableImage writableImage = new WritableImage(100, 100);
PixelWriter pixelWriter = writableImage.getPixelWriter();
for (int i = 0; i < 100; i++) {
    for (int k = 0; k < 100; k++) {
        pixelWriter.setColor(i, k, Color.RED);
    }
}

ImageView imageView = new ImageView(writableImage);


操作现有图片

![](https://cdn.jsdelivr.net/gh/luoshuaidev/luoshuaidev.github.io@image/20200525213103.png)

Image image = new Image("image/portrait.jpg");
WritableImage writableImage = new WritableImage(image.getPixelReader(), 60, 0, 200, 200);

PixelWriter pixelWriter = writableImage.getPixelWriter();
for (int i = 0; i < 50; i++) {
    for (int k = 0; k < 50; k++) {
        pixelWriter.setColor(i, k, Color.RED);
    }
}

ImageView imageView = new ImageView(writableImage);

一张图片写入另一张图片

方法 1

Image image1 = new Image("image/image1.png");
Image image2 = new Image("image/image2.png");
WritableImage writableImage = new WritableImage(image1.getPixelReader(), 0, 0, 1000, 600);

PixelWriter pixelWriter = writableImage.getPixelWriter();
PixelReader pixelReader = image2.getPixelReader();

for (int i = 0; i < 500; i++) {
    for (int j = 0; j < 600; j++) {
        Color color = pixelReader.getColor(i, j);
        pixelWriter.setColor(i, j, color);
    }
}

ImageView imageView = new ImageView(writableImage);

方法 2

Image image1 = new Image("image/image1.png");
Image image2 = new Image("image/image2.png");
WritableImage writableImage = new WritableImage(image1.getPixelReader(), 0, 0, 1000, 600);

PixelWriter pixelWriter = writableImage.getPixelWriter();
PixelReader pixelReader = image2.getPixelReader();

WritablePixelFormat<IntBuffer> pixelFormat = PixelFormat.getIntArgbPreInstance();
int[] buffer = new int[1000 / 2 * 600];
pixelReader.getPixels(0, 0, 1000 / 2, 600, pixelFormat, buffer, 0, 1000 / 2);
pixelWriter.setPixels(0, 0, 1000 / 2, 600, pixelFormat, buffer, 0, 1000 / 2);
ImageView imageView = new ImageView(writableImage);

方法 3

Image image1 = new Image("image/image1.png");
Image image2 = new Image("image/image2.png");
WritableImage writableImage = new WritableImage(image1.getPixelReader(), 0, 0, 1000, 600);

PixelWriter pixelWriter = writableImage.getPixelWriter();
PixelReader pixelReader = image2.getPixelReader();

pixelWriter.setPixels(0, 0, 1000 / 2, 600, pixelReader, 0, 0);
ImageView imageView = new ImageView(writableImage);

图片写入文件

BufferedImage bufferedImage = SwingFXUtils.fromFXImage(writableImage, null);
ImageIO.write(bufferedImage, "png", new File("D:/image.png"));

截图 Node.snapshot()

Image image = new Image("image/portrait.jpg");
ImageView imageView = new ImageView(image);

WritableImage snapshot = imageView.snapshot(null, null);
BufferedImage bufferedImage = SwingFXUtils.fromFXImage(snapshot, null);
ImageIO.write(bufferedImage, "png", new File("D:/image.png"));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX 控件 ImageView 的相关文章

  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • 在此代码中,Runnable 未实例化。为什么?

    Runnable cannot instantiate public class Thread4 public static void main String args Thread t1 new Thread new Runnable R
  • 使用 Eclipse 将具有外部依赖项的 Java 项目导出到 jar

    有没有一种简单的方法可以将 Java 项目 包括其所有外部依赖项 导出到标准 jar 文件 我开发了一个使用多个 Apache 库的 SDK 我希望能够将该项目作为单个 jar 发布 到目前为止我找到的这个问题的答案要求将项目打包为 Run
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • 按位运算符简单地翻转整数中的所有位?

    我必须翻转整数的二进制表示形式中的所有位 鉴于 10101 输出应该是 01010 当与整数一起使用时 完成此操作的按位运算符是什么 例如 如果我正在编写类似的方法int flipBits int n 什么会进入身体 我只需要翻转数字中已经
  • 如何停止使用扫描仪从标准输入读取多行?

    我正在做一个 JAVA 作业 应该处理多行输入 指令显示 输入是从标准输入读取的 给出了示例输入的示例 one 1 two 2 three 3 我不明白上面的示例输入 从标准输入读取 是什么意思 这是我编写的一个测试程序 它可以消除我的困惑
  • 我应该使用 JDBC getNString() 而不是 getString() 吗?

    我们正在构建一个由 Oracle 数据库支持的 Java 应用程序 我们使用 JDBC 驱动程序 访问该数据库ojdbc6 jar and orai18n jar 数据库模式主要使用以下方式存储文本列NVARCHAR2数据类型 The JD
  • 为本地@ExceptionHandler编写JUnit测试

    我有以下控制器 class Controller ResponseStatus HttpStatus OK RequestMapping value verifyCert method RequestMethod GET public vo
  • 如何从 Java 中“double”类型的值中删除小数值

    我正在调用一个名为 calculateStampDuty 的方法 它将返回 财产需缴纳的印花税金额 百分比计算有效 很好 并返回正确的值 15000 0 但是 我想显示该值 前端用户只是 15000 所以只想删除小数点和任何前面的值 此后
  • 使用java在网页中进行字符编码

    如何使用java找出网页中的字符编码类型 打开与 URL 的连接 使用URL openConnection http download oracle com javase 6 docs api java net URL html openC
  • 开发人员实际上是否使用 vim 在 Windows 操作系统上编写代码(Java)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何构建和使用 TimeSeriesCollections

    我想在图表的 X 轴上显示一些日期 并且here https stackoverflow com questions 5118684 jfreechart histogram with dates据说我必须使用 TimeSeriesColl
  • Java:java.util.Preferences 失败

    我的程序将加密的产品密钥数据保存到计算机上java util Preferences类 系统首选项 而不是用户 问题是 在 Windows 和 Linux 上 尚未在 OSX 上测试过 但可能是相同的 如果我不运行该程序sudo或者具有管理
  • Java 常量枚举[重复]

    这个问题在这里已经有答案了 可能的重复 理解 Java 中的枚举 https stackoverflow com questions 1419835 understanding enums in java 为什么我们应该使用枚举而不是 Ja
  • 用于安装 R 软件包的备用编译器:clang:错误:不支持的选项“-fopenmp”

    我正在尝试在 OS X 10 11 6 上使用 R 版本 3 4 0 安装 rJava 包 install packages rJava type source 我收到以下错误 clang o libjri jnilib Rengine o
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • 接口中“不能降低继承方法的可见性”的含义

    我有两个文件 public interface PrintService void print PrintDetails details class PrintDetails private String printTemplate pub
  • 通过向上转换将 Java.sql.date 转换为 Java.util.date 安全吗?

    java sql date 扩展了 java util date 那么通过将 java sql date 转换为 java util date 是否可以在两者之间进行转换 或者有其他方法可以转换它们吗 您不一定需要强制转换 您可以将 SQL
  • 膨胀类 android.support.design.widget.CoordinatorLayoute 时出错

    我正在尝试运行我的应用程序 但不断收到标题中列出的错误 我读过周围的内容 人们说尝试将主题更改为 AppCombat 主题 但这似乎不起作用 以下是我遇到的错误 Process com example jmeyer27 crazytiles
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即

随机推荐

  • Android开发之RxJava使用

    RxJava是响应式编程 也可以理解为流式编程 核心是观察者模式 Rx是微软 Net的一个响应式扩展 Rx借助可观测的序列提供一种简单的方式来创建异步的 基于事件驱动的程序 2012年Netflix为了应对不断增长的业务需求开始将 NET
  • 华为OD机试 - 数字反转打印(Java)

    题目描述 小华是个对数字很敏感的小朋友 他觉得数字的不同排列方式有特殊美感 某天 小华突发奇想 如果数字多行排列 第一行1个数 第二行2个 第三行3个 即第n行有n个数字 并且奇数行正序排列 偶数行逆序排列 数字依次累加 这样排列的数字一定
  • AD9361配置采用纯PL方式,QT编写的小软件可以快速实现

    采用ADI官方的API函数 虽然能够快速的实现AD9361配置 让我们不必关注9361的内部寄存器的配置过程 但是在实际的项目开发过程中 也在一定程度上限制了AD9361与PL之间数据交互的灵活性 今天给大家推荐采用AD9361官方提供的配
  • Android开发之逐帧动画优化

    Android上如果使用逐帧动画的话 可以很方便地使用AnimationDrawable 无论是先声明xml还是直接代码里设置 都是几分钟的事 但使用AnimationDrawable有一个致命的弱点 那就是需要一次性加载所有图片到内存 万
  • go语言基础-----17-----channel创建、读写、安全关闭、多路复用select

    1 通道channel介绍 1 channel 可译为通道 是go语言协程goroutine之间的通信方式 2 channel通信可以想象成从管道的一头塞进数据 从另一头读取数据 通道作为容器是有限定大小的 满了就写不进去 空了就读不出来
  • 高防CDN对于网站、平台有着至关重要作用?

    1 减轻服务器的占用率和网站服务器的带宽资源 通过使用CDN服务 用户可以在CDN节点上分发对主要频道 包括页面和图片 的访问 这样可以减少源设备上的负载压力和带宽资源 并将资源保存到相同的带宽消耗服务中 如邮件 论坛和服务器资源 以保证网
  • 热区的使用方法

    1 如图所示 热区的位置是在元件库中 这样的一个标识 2 热区的使用经常会搭配一些比较小的文字或者图片等区域 只要是在热区中 随便点击哪一个地方都是属于这个区域 3 我们做了几个页面 样式不同 4 如图 我们创建一个热区在02的选区中 5
  • python + selenium实现巨潮资讯网指定范围年报下载

    大家好 第一次写文章 紧张滴捏 这段时间在做课设 课设里需要下载沪市600000到601000号的年报原文做数字化关键词的词频分析 想着用程序帮我批量下载一下 但是找了一下貌似没有类似的代码 就写了一个应用selenium库来做模拟下载的p
  • 各类打印机驱动官网下载安装

    前言概述 找驱动很简单 但是网上有时候找起来有点费劲呢 不安全 目前市面上打印机驱动搜索软件好用的基本都要付费 或者不全 比如下图这个就是付费的 常用的打印机品牌 惠普 HP 佳能 Canon 爱普生 Epson 京瓷 Kyocera 三星
  • 二流计算机学校,学校可以是二流的,但你不是

    我每天都会看大家在微博里给我的留言 时常看到深夜 私信的 每一条都看 问的最多的一种问题 是这么开头的 我的学校不好 或者 我是一个来自二 三 本学校的学生 我该怎么办 我不知道怎么回答 因为我不觉得来自一个二流的学校就应该过着二流的生活
  • C语言实现队列(链表实现)

    队列 Queue 也是运算受限的线性表 是一种先进先出 First In First Out 简称 FIFO 的线性表 只允许在表的一端进行插入 而在另一端进行删除 队首 front 允许进行删除的一端称为队首 队尾 rear 允许进行插入
  • 浅析Linux内核中的链表

    1 内核中的链表 linux内核链表与众不同 他不是把将数据结构塞入链表 而是将链表节点塞入数据 在2 1内核中引入了官方链表 从此内核中所有的链表使用都采用此链表 千万不要在重复造车轮子了 链表实现定义在
  • 第五届蓝桥杯Java A组决赛试题

    1 标题 海盗分金币 有5个海盗 相约进行一次帆船比赛 比赛中天气发生突变 他们被冲散了 恰巧 他们都先后经过途中的一个无名的荒岛 并且每个人都信心满满 觉得自己是第一个经过该岛的人 第一个人在沙滩上发现了一堆金币 他把金币分成5等份 发现
  • STM32CubeMX驱动MPU6050模块

    文章目录 1 MPU6050模块简介 2 MPU6050重要寄存器介绍 2 1 数字低通滤波器配置寄存器CONFIG 2 2 采样率分频寄存器SMPRT DIV 2 3 加速度计配置寄存器ACCEL CONFIG 2 4 角速度计配置寄存器
  • 区别:OrderedDict vs dict

    OrderedDict 和 dict 是两种字典类型 都用于存储键值对 key value pairs dict 是Python的内置字典类型 它是无序的 即它不会按照元素插入的顺序来保存键值对 当你通过键来访问 dict 中的值时 Pyt
  • sqoop query时单双引号选用以及$CONDITION使用的探究

    这段时间碰见了一个奇怪的sqoop导入问题 我的业务目标是想将postgresql库里的某张表内的数据导入到hive里 而且在导入的时候需要做一步查询 但在导入的时候 围绕着 CONDITION 这个参数 会有不同的运行结果 有的报错 有的
  • MySQL基础架构与日志详解

    一 MySQL基础架构 MySQL可以分为Server层和存储引擎层两部分 Server层包括连接器 查询缓存 分析器 优化器 执行器等 涵盖MySQL的大多数核心服务功能 以及所有的内置函数 如日期 时间 数学和加密函数等 所有跨存储引擎
  • 软件需求之DFD图

    DFD图是一种以数据和数据的封闭性为基础 从问题空间到某种表示的映射方法 是一种结构化分析方法 DFD图在软件的需求分析中发挥着不可替代的作用 DFD图在软考中是必考的内容 在软件工程中也是一个非常中要的图 下面是我结合网上的资料和自己的所
  • Linux系统里压缩PDF文件大小

    sudo apt get install ghostscript gs sDEVICE pdfwrite dCompatibilityLevel 1 4 dPDFSETTINGS screen dNOPAUSE dQUIET dBATCH
  • JavaFX 控件 ImageView

    ImageView 支持格式 BMP GIF JPEG PNG 加载图片 如果设置了 requestedXXX 尺寸 ImageView中 设置 FitXXX 尺寸是基于requestedXXX 尺寸缩放 Image image new I