На днях я участвовал в потоке Изображение / Графика в форму и сделал хакерскую попытку получить контур изображения, добавляя Прямоугольник
итеративно в область
. Это было очень медленно.
В этом примере вместо этого создается GeneralPath
и создается область
из GP. Намного быстрее.
Изображение в верхнем левом углу является «исходным изображением». Два справа - это разные стадии обработки контура. Оба они имеют неровные края по кругу и по наклонным сторонам треугольника.
Я хотел бы получить форму, в которой эта неровность удалена или уменьшена.
1234
1 **
2 **
3 ***
4 ***
5 ****
6 ****
Углы находятся в:
1234
1 ****
2 ****
3 **
4 **
5 ****
6 ****
Углы находятся в:
Предполагая, что наш путь имел показанные формы и точки, как указано, я бы хотел опустить 'внутренний угловые точки первого набора, сохраняя при этом «пару» внутренних углов (часть изображения) для второго.
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