从点创建java.awt.geom.Area
我试图创建一个java.awt.geom.Area(或任何使用Shape接口的对象)来描述创建复杂形状的一组点。以下是一个例子: 我试图创建一个区域对象(或许多区域对象)来描述黄色区域。我有一种获取黄色像素坐标的简单方法,但我不知道如何创建一个包含所有黄色点的区域对象(或多个区域对象) 这个stackoverflow问题似乎非常相关),但正在使用Matlab。我想其他人在这里问了一个非常类似的问题(),但答案中提供的链接已经失效。我会创建一个或一个,这两个都实现了从点创建java.awt.geom.Area,java,geometry,awt,2d,shape,Java,Geometry,Awt,2d,Shape,我试图创建一个java.awt.geom.Area(或任何使用Shape接口的对象)来描述创建复杂形状的一组点。以下是一个例子: 我试图创建一个区域对象(或许多区域对象)来描述黄色区域。我有一种获取黄色像素坐标的简单方法,但我不知道如何创建一个包含所有黄色点的区域对象(或多个区域对象) 这个stackoverflow问题似乎非常相关),但正在使用Matlab。我想其他人在这里问了一个非常类似的问题(),但答案中提供的链接已经失效。我会创建一个或一个,这两个都实现了形状。说明如何使用与路径2D非
形状。说明如何使用与路径2D非常相似的GeneralPath
。然后可以使用形状创建区域
,例如
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.geom.Area;
import javax.imageio.ImageIO;
import java.io.File;
import java.net.URL;
import java.util.Date;
import javax.swing.*;
/* See also http://stackoverflow.com/q/7052422/418556 */
class ImageOutline {
public static Area getOutline(
BufferedImage image, Color color, boolean include, int tolerance) {
Area area = new Area();
for (int x=0; x<image.getWidth(); x++) {
for (int y=0; y<image.getHeight(); y++) {
Color pixel = new Color(image.getRGB(x,y));
if (include) {
if (isIncluded(color, pixel, tolerance)) {
Rectangle r = new Rectangle(x,y,1,1);
area.add(new Area(r));
}
} else {
if (!isIncluded(color, pixel, tolerance)) {
Rectangle r = new Rectangle(x,y,1,1);
area.add(new Area(r));
}
}
}
}
return area;
}
public static boolean isIncluded(
Color target, Color pixel, int tolerance) {
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 static BufferedImage drawOutline(int w, int h, Area area) {
final BufferedImage result = new BufferedImage(
w,
h,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = result.createGraphics();
g.setColor(Color.white);
g.fillRect(0,0,w,h);
g.setClip(area);
g.setColor(Color.red);
g.fillRect(0,0,w,h);
g.setClip(null);
g.setStroke(new BasicStroke(1));
g.setColor(Color.blue);
g.draw(area);
return result;
}
public static BufferedImage createAndWrite(
BufferedImage image,
Color color,
boolean include,
int tolerance,
String name)
throws Exception {
int w = image.getWidth();
int h = image.getHeight();
System.out.println("Get Area: " + new Date() + " - " + name);
Area area = getOutline(image, color, include, tolerance);
System.out.println("Got Area: " + new Date() + " - " + name);
final BufferedImage result = drawOutline(w,h,area);
displayAndWriteImage(result, name);
return result;
}
public static void displayAndWriteImage(
BufferedImage image, String fileName) throws Exception {
ImageIO.write(image, "png", new File(fileName));
JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(image)));
}
public static void main(String[] args) throws Exception {
URL url = new URL("http://i.stack.imgur.com/aGBuT.png");
final BufferedImage outline = ImageIO.read(url);
displayAndWriteImage(outline, "motorcycle-01.png");
createAndWrite(
outline, Color.white, false, 60, "YellowBlobOutline.png");
}
}
import java.awt.*;
导入java.awt.image.buffereImage;
导入java.awt.geom.Area;
导入javax.imageio.imageio;
导入java.io.File;
导入java.net.URL;
导入java.util.Date;
导入javax.swing.*;
/*另见http://stackoverflow.com/q/7052422/418556 */
课堂教学大纲{
公共静态区域概述(
BuffereImage图像、颜色、布尔值包括、整数公差){
面积=新面积();
对于(int x=0;x的可能重复项,如果它有助于解决问题,请参见)。