You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java图像分割Demo技术咨询:修改鼠标交互时的非灰度图像显示

Java Swing图像分割Demo:替换灰度效果为其他图像样式

现有基于Java Swing的图像分割Demo通过ColorConvertOp将原图转为灰度图,鼠标拖动分割线时,线上方显示灰度图。需求是修改代码,让分割线上方显示灰度以外的其他图像效果,以下是完整代码及解决方案:

现有Demo主类代码

import java.awt.event.*;
import java.awt.image.*;
import java.awt.*;
import java.awt.color.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

// 이미지유틸리티.java, 이미지분할.java
public class Image_Segmentation_Demo extends JComponent{
    public static void main(String[] args) {
        JFrame f = new JFrame();
        String FName = "Hok1.png";
        이미지분할 Seg = new 이미지분할(FName);
        BufferedImage Source  = Seg.getImage();
//        BufferedImageOp Target = new BufferedImage(ImageIO.write("example.jpg"));
        BufferedImageOp Target = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
        BufferedImage Ref = Target.filter(Source, null);
        Seg.setSecondImage(Ref);
        f.setLayout(new BorderLayout());
        f.add(Seg, BorderLayout.CENTER);
        f.setSize(f.getPreferredSize());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

이미지분할(图像分割)类完整代码

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.geom.Line2D;

import javax.swing.*;

public class 이미지분할 extends JPanel {
  private BufferedImage 이미지;
  private BufferedImage 두번째이미지;
  private int 분할x;
  
  public 이미지분할(String 경로) {
    setImage(경로); init();
  }
  
  public 이미지분할(BufferedImage 버퍼이미지) {
    setImage(버퍼이미지); init();
  }

  public void setImage(String 경로) {
    Image 버퍼이미지 = 이미지유틸리티.로드봉쇄(경로);
    이미지 = 이미지유틸리티.이미지버퍼생성(버퍼이미지);
  }

  public void setImage(BufferedImage 버퍼이미지) { 이미지 = 버퍼이미지; }

  public void setSecondImage(BufferedImage 버퍼이미지) {
    두번째이미지 = 버퍼이미지; repaint();
  }
  
  public BufferedImage getImage() { return 이미지; }
  public BufferedImage getSecondImage() { return 두번째이미지; }
  
  private void init() {
    setBackground(Color.white);
    addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent me) {
        분할x = me.getY(); repaint();
      }
    });
    addMouseMotionListener(new MouseMotionAdapter() {
      public void mouseDragged(MouseEvent me) {
        분할x = me.getY(); repaint();
      }
    });
  }
  
  public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    int width = getSize().width;
    int height = getSize().height;
    
    // 清空窗口
    Rectangle clear = new Rectangle(0, 0, width, height);
    g2.setPaint(getBackground());
    g2.fill(clear);
    // 裁剪显示原图区域
    if (분할x != 0 && 두번째이미지 != null) {
      Rectangle 첫번째클립 = new Rectangle(0, 분할x, width, height - 분할x);
      g2.setClip(첫번째클립);
    }
    g2.drawImage(getImage(), 0, 0, null);
    
    if (분할x == 0 || 두번째이미지 == null) return;
    
    // 裁剪显示效果图像区域
    Rectangle 두번째클립 = new Rectangle(0, 0, width, 분할x);
    g2.setClip(두번째클립);
    g2.drawImage(두번째이미지, 0, 0, null);
    
    // 绘制分割线
    Line2D 분할선 = new Line2D.Float(0, 분할x, width, 분할x);
    g2.setClip(null);
    g2.setColor(Color.white);
    g2.draw(분할선);
  }

  public Dimension getPreferredSize() {
    int width = getImage().getWidth();
    int height = getImage().getHeight();
    if (두번째이미지 != null) {
      width = Math.max(width, 두번째이미지.getWidth());
      height = Math.max(height, 두번째이미지.getHeight());
    }
    return new Dimension(width, height);
  }
}

替换灰度效果的解决方案

只需替换Demo主类中BufferedImageOp Target = new ColorConvertOp(...)这一行代码,以下是几种常见效果的实现:

1. 颜色反转效果

通过自定义BufferedImageOp实现:

BufferedImageOp Target = new BufferedImageOp() {
    @Override
    public BufferedImage filter(BufferedImage src, BufferedImage dest) {
        if (dest == null) {
            dest = new BufferedImage(src.getWidth(), src.getHeight(), src.getType());
        }
        for (int y = 0; y < src.getHeight(); y++) {
            for (int x = 0; x < src.getWidth(); x++) {
                int rgb = src.getRGB(x, y);
                int r = 255 - ((rgb >> 16) & 0xFF);
                int g = 255 - ((rgb >> 8) & 0xFF);
                int b = 255 - (rgb & 0xFF);
                dest.setRGB(x, y, (rgb & 0xFF000000) | (r << 16) | (g << 8) | b);
            }
        }
        return dest;
    }

    @Override
    public Rectangle2D getBounds2D(BufferedImage src) { return new Rectangle(src.getWidth(), src.getHeight()); }
    @Override
    public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel destCM) { return null; }
    @Override
    public Point2D getPoint2D(Point2D srcPt, Point2D dstPt) { return null; }
    @Override
    public RenderingHints getRenderingHints() { return null; }
};

2. 边缘检测(索贝尔算子)

使用ConvolveOp实现边缘检测:

// 索贝尔X方向卷积核
float[] sobelX = {
    -1, 0, 1,
    -2, 0, 2,
    -1, 0, 1
};
Kernel kernel = new Kernel(3, 3, sobelX);
BufferedImageOp Target = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);

3. 高斯模糊效果

// 模糊半径设为5,可调整数值改变模糊程度
BufferedImageOp Target = new GaussianBlurOp(5);

注:GaussianBlurOp在Java 9+可用,低版本可自定义实现。

4. 暖色调偏移

通过RescaleOp调整RGB通道亮度:

// 增强红色通道,减弱蓝色通道
float[] scales = {1.2f, 1.0f, 0.8f, 1.0f}; // R, G, B, Alpha
float[] offsets = {0, 0, 0, 0};
BufferedImageOp Target = new RescaleOp(scales, offsets, null);

替换后运行Demo,拖动分割线即可看到对应效果显示在分割线上方。

内容的提问来源于stack exchange,提问作者user20654610

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:25:23