使用 OpenCV 降低图像亮度的 JavaFX 示例。
javaobject oriented programmingprogramming
使用 Java 改变图像亮度的一种方法是使用 convertTo() 方法。此方法对给定矩阵执行所需的计算,以改变图像的对比度和亮度。此方法接受 4 个参数 −
mat − 空矩阵,用于保存与源矩阵大小和类型相同的结果。
rtype − 整数值,指定输出矩阵的类型。如果此值为负数,则类型与源相同。
alpha − 增益值,必须大于 0(默认值为 1)。
beta −偏差值(默认值为 0)。
如果为参数 beta 选定的值是负值(0 到 -255),则图像的亮度会降低。
示例
import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.embed.swing.SwingFXUtils; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Slider; import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javax.imageio.ImageIO; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfByte; import org.opencv.imgcodecs.Imgcodecs; public class DecreasingBrightnessJavaFX extends Application { double contrast = 1; private final int rtype = -1; double alpha = 1; double beta = 0; Slider slider1; int sliderMinVal = 0; int sliderMaxVal = 255; int sliderInitVal = 255; Mat src = null; public void start(Stage stage) throws IOException { //加载 OpenCV 核心库 System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); String file ="D:\Image\cuba.jpg"; src = Imgcodecs.imread(file); WritableImage writableImage = loadImage(src); //设置图像视图 ImageView imageView = new ImageView(writableImage); imageView.setX(25); imageView.setY(25); imageView.setFitHeight(400); imageView.setFitWidth(550); imageView.setPreserveRatio(true); //设置滑块 slider1 = new Slider(sliderMinVal, sliderMaxVal, sliderInitVal); slider1.setShowTickLabels(true); slider1.setShowTickMarks(true); slider1.setMajorTickUnit(25); slider1.setBlockIncrement(10); //设置标签 Label label1 = new Label(); Label label2 = new Label(); //滑块的监听器 slider1.valueProperty().addListener(new ChangeListener<Number>() { public voidchanged(ObservableValue <?extends Number>observable, Number oldValue, Number newValue){ try { alpha = newValue.doubleValue(); Mat dest = new Mat(src.rows(), src.cols(), src.type()); alpha = (alpha/sliderMaxVal); beta = 1.0 - alpha; label1.setText("α-value: " + alpha); label2.setText("β-value: " + beta); src.convertTo(dest, rtype, alpha, beta); imageView.setImage(loadImage(dest)); } catch(Exception e) { System.out.println(""); } } }); //VBox 排列所有三个组件 VBox vbox = new VBox(); vbox.setPadding(new Insets(20)); vbox.setSpacing(10); vbox.getChildren().addAll(label1, label2, slider1, imageView); //创建场景对象 Scene scene = new Scene(vbox, 600, 450); stage.setTitle("缩小图像"); stage.setScene(scene); stage.show(); } public WritableImage loadImage(Mat image) throws IOException { MatOfByte matOfByte = new MatOfByte(); Imgcodecs.imencode(".jpg", image, matOfByte); //将编码的 Mat 存储在字节数组中 byte[] byteArray = matOfByte.toArray(); //显示图像 InputStream in = new ByteArrayInputStream(byteArray); BufferedImage bufImage = ImageIO.read(in); WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null); return writableImage; } public static void main(String args[]) { launch(args); } }