我在另一天参加了线程

Image/Graphic into a Shape,并通过向“区域”中迭代地添加一个矩形,并尝试获取图像的轮廓.那很慢

该示例代替构建GeneralPath并从GP创建区域.快多了.

左上角的图像是“源图像”.右边的两个是处理轮廓的各个阶段.它们都在圆周和锯齿状的三角形的边缘上有锯齿状的边缘.

我想获得一个去除或减少锯齿状的形状.

在ASCII艺术

情况1:

1234

1 **

2 **

3 ***

4 ***

5 ****

6 ****

角落在:

(2,3)内角

>(3,3)

(3,5)内角

>(4,5)

情况2:

1234

1 ****

2 ****

3 **

4 **

5 ****

6 ****

角落在:

>(4,2)

>(2,2)内角

>(2,5)内角

>(4,5)

假设我们的路径具有所示的形状,以及列出的点,我想放下第一组的“内角”点,同时保留内部角的“对”(图像中的一个点),用于第2位.

>有人可以建议一些聪明的内置方法来解除这个工作吗?

>如果不这样做,确定位置和方法是一个好办法自然(对/单)内角? (我猜我可以得到一个PathIterator,并建立一个新的GeneralPath,抛出单一的内在角落 – 如果只有我可以弄清楚如何识别它们!

这里是要玩的代码:

import java.awt.*;

import java.awt.event.*;

import java.awt.image.*;

import java.awt.geom.*;

import javax.swing.*;

import javax.swing.border.*;

import javax.swing.event.*;

/* Gain the outline of an image for further processing. */

class ImageOutline {

private BufferedImage image;

private TwoToneImageFilter twoToneFilter;

private BufferedImage imageTwoTone;

private JLabel labelTwoTone;

private BufferedImage imageOutline;

private Area areaOutline = null;

private JLabel labelOutline;

private JLabel targetColor;

private JSlider tolerance;

private JProgressBar progress;

private SwingWorker sw;

public ImageOutline(BufferedImage image) {

this.image = image;

imageTwoTone = new BufferedImage(

image.getWidth(),

image.getHeight(),

BufferedImage.TYPE_INT_RGB);

}

public void drawOutline() {

if (areaOutline!=null) {

Graphics2D g = imageOutline.createGraphics();

g.setColor(Color.WHITE);

g.fillRect(0,0,imageOutline.getWidth(),imageOutline.getHeight());

g.setColor(Color.RED);

g.setClip(areaOutline);

g.fillRect(0,0,imageOutline.getWidth(),imageOutline.getHeight());

g.setColor(Color.BLACK);

g.setClip(null);

g.draw(areaOutline);

g.dispose();

}

}

public Area getOutline(Color target, BufferedImage bi) {

// construct the GeneralPath

GeneralPath gp = new GeneralPath();

boolean cont = false;

int targetRGB = target.getRGB();

for (int xx=0; xx

for (int yy=0; yy

if (bi.getRGB(xx,yy)==targetRGB) {

if (cont) {

gp.lineTo(xx,yy);

gp.lineTo(xx,yy+1);

gp.lineTo(xx+1,yy+1);

gp.lineTo(xx+1,yy);

gp.lineTo(xx,yy);

} else {

gp.moveTo(xx,yy);

}

cont = true;

} else {

cont = false;

}

}

cont = false;

}

gp.closePath();

// construct the Area from the GP & return it

return new Area(gp);

}

public JPanel getGui() {

JPanel images = new JPanel(new GridLayout(2,2,2,2));

JPanel gui = new JPanel(new BorderLayout(3,3));

JPanel originalImage = new JPanel(new BorderLayout(2,2));

final JLabel originalLabel = new JLabel(new ImageIcon(image));

targetColor = new JLabel("Target Color");

targetColor.setForeground(Color.RED);

targetColor.setBackground(Color.WHITE);

targetColor.setBorder(new LineBorder(Color.BLACK));

targetColor.setOpaque(true);

JPanel controls = new JPanel(new BorderLayout());

controls.add(targetColor, BorderLayout.WEST);

originalLabel.addMouseListener( new MouseAdapter() {

@Override

public void mouseEntered(MouseEvent me) {

originalLabel.setCursor(

Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));

}

@Override

public void mouseExited(MouseEvent me) {

originalLabel.setCursor(Cursor.getDefaultCursor());

}

@Override

public void mouseClicked(MouseEvent me) {

int x = me.getX();

int y = me.getY();

Color c = new Color( image.getRGB(x,y) );

targetColor.setBackground( c );

updateImages();

}

});

originalImage.add(originalLabel);

tolerance = new JSlider(

JSlider.HORIZONTAL,

0,

255,

104

);

tolerance.addChangeListener( new ChangeListener() {

public void stateChanged(ChangeEvent ce) {

updateImages();

}

});

controls.add(tolerance, BorderLayout.CENTER);

gui.add(controls,BorderLayout.NORTH);

images.add(originalImage);

labelTwoTone = new JLabel(new ImageIcon(imageTwoTone));

images.add(labelTwoTone);

images.add(new JLabel("Smoothed Outline"));

imageOutline = new BufferedImage(

image.getWidth(),

image.getHeight(),

BufferedImage.TYPE_INT_RGB

);

labelOutline = new JLabel(new ImageIcon(imageOutline));

images.add(labelOutline);

updateImages();

progress = new JProgressBar();

gui.add(images, BorderLayout.CENTER);

gui.add(progress, BorderLayout.SOUTH);

return gui;

}

private void updateImages() {

if (sw!=null) {

sw.cancel(true);

}

sw = new SwingWorker() {

@Override

public String doInBackground() {

progress.setIndeterminate(true);

adjustTwoToneImage();

labelTwoTone.repaint();

areaOutline = getOutline(Color.BLACK, imageTwoTone);

drawOutline();

return "";

}

@Override

protected void done() {

labelOutline.repaint();

progress.setIndeterminate(false);

}

};

sw.execute();

}

public void adjustTwoToneImage() {

twoToneFilter = new TwoToneImageFilter(

targetColor.getBackground(),

tolerance.getValue());

Graphics2D g = imageTwoTone.createGraphics();

g.drawImage(image, twoToneFilter, 0, 0);

g.dispose();

}

public static void main(String[] args) throws Exception {

int size = 150;

final BufferedImage outline =

new BufferedImage(size,size,BufferedImage.TYPE_INT_RGB);

Graphics2D g = outline.createGraphics();

g.setColor(Color.WHITE);

g.fillRect(0,0,size,size);

g.setRenderingHint(

RenderingHints.KEY_DITHERING,

RenderingHints.VALUE_DITHER_ENABLE);

g.setRenderingHint(

RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

Polygon p = new Polygon();

p.addPoint(size/2, size/10);

p.addPoint(size-10, size-10);

p.addPoint(10, size-10);

Area a = new Area(p);

Rectangle r = new Rectangle(size/4, 8*size/10, size/2, 2*size/10);

a.subtract(new Area(r));

int radius = size/10;

Ellipse2D.Double c = new Ellipse2D.Double(

(size/2)-radius,

(size/2)-radius,

2*radius,

2*radius

);

a.subtract(new Area(c));

g.setColor(Color.BLACK);

g.fill(a);

ImageOutline io = new ImageOutline(outline);

JFrame f = new JFrame("Image Outline");

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.add(io.getGui());

f.pack();

f.setResizable(false);

f.setLocationByPlatform(true);

f.setVisible(true);

}

}

class TwoToneImageFilter implements BufferedImageOp {

Color target;

int tolerance;

TwoToneImageFilter(Color target, int tolerance) {

this.target = target;

this.tolerance = tolerance;

}

private boolean isIncluded(Color pixel) {

int rT = target.getRed();

int gT = target.getGreen();

int bT = target.getBlue();

int rP = pixel.getRed();

int gP = pixel.getGreen();

int bP = pixel.getBlue();

return(

(rP-tolerance<=rT) && (rT<=rP+tolerance) &&

(gP-tolerance<=gT) && (gT<=gP+tolerance) &&

(bP-tolerance<=bT) && (bT<=bP+tolerance) );

}

public BufferedImage createCompatibleDestImage(

BufferedImage src,

ColorModel destCM) {

BufferedImage bi = new BufferedImage(

src.getWidth(),

src.getHeight(),

BufferedImage.TYPE_INT_RGB);

return bi;

}

public BufferedImage filter(

BufferedImage src,

BufferedImage dest) {

if (dest==null) {

dest = createCompatibleDestImage(src, null);

}

for (int x=0; x

for (int y=0; y

Color pixel = new Color(src.getRGB(x,y));

Color write = Color.BLACK;

if (isIncluded(pixel)) {

write = Color.WHITE;

}

dest.setRGB(x,y,write.getRGB());

}

}

return dest;

}

public Rectangle2D getBounds2D(BufferedImage src) {

return new Rectangle2D.Double(0, 0, src.getWidth(), src.getHeight());

}

public Point2D getPoint2D(

Point2D srcPt,

Point2D dstPt) {

// no co-ord translation

return srcPt;

}

public RenderingHints getRenderingHints() {

return null;

}

}

java如何处理锯齿_java – 平滑锯齿的路径相关推荐

  1. java linux 当前路径_Java,Linux文件路径

    斜杠和反斜杠 正斜杠,又称左斜杠,符号是"/": 反斜杠,也称右斜杠,符号是"\". 在Unix/Linux中,路径的分隔采用正斜"/",比 ...

  2. java 获取当前目录_java获得当前文件路径

    第一种: File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f); ...

  3. java获得当前路径_JAVA 取得当前目录的路径/Servlet/class/文件路径/web路径/url地址...

    在写java程序时不可避免要获取文件的路径...总结一下,遗漏的随时补上 1.可以在servlet的init方法里 String path = getServletContext().getRealP ...

  4. java输出文件目录_Java实现打印文件路径和展示文件目录

    /** 输入文件或目录,若为文件打印其路径和名字, * 若为目录,可选文件后缀名,若不选,则打印其下所有文件, * 若选择后缀名,则打印其下所有匹配后缀名的文件 * * * mist lee,2014 ...

  5. java 画图板 锯齿_java绘画中的锯齿问题

    java给图中的锯齿问题也称作呈现兼容性问题 JDK(tm)1.1呈现模型是基于像素给的模型,该模型的坐标无限细分,且位于像素之间.使用一个一像素宽的画笔执行绘制操作,填充路径锚点向下和向右的像素.J ...

  6. java application 路径_java项目获取根路径(web项目和application项目的区分)

    Java项目中经常要读取配置文件,涉及到读取配置文件的地方,就会要读定位文件的路径.因此,在项目如何正确获取文件路径尤为关键. 根据不同的java项目,在获取文件路径时候有一些 小区别 测试环境:E: ...

  7. java linux路径_Java,Linux文件路径

    斜杠和反斜杠 正斜杠,又称左斜杠,符号是"/": 反斜杠,也称右斜杠,符号是"\". 在Unix/Linux中,路径的分隔采用正斜"/",比 ...

  8. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  9. java servlet 请求_Java中前台JSP请求Servlet实例(http+Servlet)

    1.前台jsp代码 himily.jsp,定义了用户名和密码两个输入框,使用post方式提交:/order-web/HimilyServlet其中order-web为站点名称,HimilyServle ...

最新文章

  1. java键盘输入运算符_Java基础学习-三元运算符和键盘录入的基本步骤和使用
  2. 集成ShareSDK里报错NSConcreteMutableData wbsdk_base64EncodedString]
  3. 云朵机(人造云朵,造云机)用在互动百科推搜索新方法中(转)
  4. java linux 串口_Linux Java 串口通信 | 学步园
  5. Taro+react开发(32) Please use the ‘new‘ operator, this DOM object constructor cannot be called as a fu
  6. Java内置锁——synchronized
  7. mysql数据还原时报错_还原mysql数据库时报错
  8. Android ClassLoader笔记(二)
  9. 内存cgroup---CGroup中参数由来篇
  10. python debug console_pycharm Python Console调试 django 调试
  11. 元器件封装形式对照表_二三极管封装形式图表
  12. matlab平滑处理例题,(完整word版)matlab中smooth函数平滑处理数据实例
  13. 交替性注意力_玩出专注力 一次对付五种儿童专注力不足!
  14. 网页或公众号微信网页抓包软件Fiddler的正确安装使用!
  15. 计算机如何安装无线网络适配器,无线网卡驱动怎么安装?电脑无线网卡驱动2种安装方法...
  16. spark中RSS工具简介
  17. 2022年工具钳工(技师)最新解析及工具钳工(技师)试题及解析
  18. vue+canvas如何实现b站萌系登录界面
  19. 可变悬挂调节软硬_大众cc可变悬架软硬调节是什么意思
  20. 电脑可选更新到底是什么?(功能、质量和驱动程序更新)

热门文章

  1. 史上最恐怖的10篇超短篇鬼故事(转…
  2. 张博涵清华大学_特别专访 | 张博涵 上
  3. uni-app--》什么是uniapp?如何开发uniapp?
  4. 计算机系统结构——量化研究方法(第三版)
  5. Javascript笔记大全02
  6. 使用trashcan恢复linux下误删的文件
  7. check 和nocheck
  8. apache 在windows下无法启动的一个错误
  9. oCam 中文绿色版 - 免费实用的屏幕录像与截图软件 (制作视频教程/录制直播视频)
  10. 人脸检测卷积神经网络_卷积神经网络和计算机视觉的人脸面具检测算法