使用 OpenCV 降低图像亮度的 JavaFX 示例。

javaobject oriented programmingprogramming

使用 Java 改变图像亮度的一种方法是使用 convertTo() 方法。此方法对给定矩阵执行所需的计算,以改变图像的对比度和亮度。此方法接受 4 个参数 −

  • ma​​t − 空矩阵,用于保存与源矩阵大小和类型相同的结果。

  • 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);
   }
}

输入

输出


相关文章