Спасибо, haraldK за ваше предложение. Прежде чем я увидел ваш пост, я пришел к аналогичному выводу:
Используя Arraylist для вершин из операции рисования, я заполнил объект Path2D.Float, называемый «контур», просматривая список точек, созданный во время операции «рисования». Используя этот «контурный» объект, я создал экземпляр Area под названием «интерферограмма». Просто чтобы проверить мою работу, я создал еще один PathIterator, «PI», из области и разложил область, «интерферограмму» на «сегменты», отправляя результаты на консоль. Я показываю код ниже:
private void mnuitmKeepInsideActionPerformed(java.awt.event.ActionEvent evt)
{
// Keeps the inner area of interest
// Vertices is the "pts" list from Class MouseDrawing (mask)
// It is already a closed path
ArrayList<Point2D.Float> vertices =
new ArrayList<>(this.mask.getVertices());
this.contour = new Path2D.Float(Path2D.WIND_NON_ZERO);
// Read the vertices into the Path2D variable "contour"
this.contour.moveTo((float)vertices.get(0).getX(),
(float)vertices.get(0).getY()); //Starting location
for(int ivertex = 1; ivertex < vertices.size(); ivertex++)
{
this.contour.lineTo((float)vertices.get(ivertex).getX(),
(float)vertices.get(ivertex).getY());
}
this.interferogram = new Area(this.contour);
PathIterator PI = this.interferogram.getPathIterator(null);
//Test print out the segment types and vertices for debug
float[] p = new float[6];
int icount = 0;
while( !PI.isDone())
{
int type = PI.currentSegment(p);
System.out.print(icount);
System.out.print(" Type " + type);
System.out.print(" X " + p[0]);
System.out.println(" Y " + p[1]);
icount++;
PI.next();
}
BufferedImage masked = Mask(this.image_out, this.interferogram);
// Write image to file for debug
String dir;
dir = System.getProperty("user.dir");
dir = dir + "\\00masked.png";
writeImage(masked, dir, "PNG");
}
Затем я применил маску к изображению, проверяя каждый пиксель для включения в область, используя код ниже:
public BufferedImage Mask(BufferedImage BIM, Area area)
{
/** Loop through the pixels in the image and test each one for inclusion
* within the area.
* Change the colors of those outside
**/
Point2D p = new Point2D.Double(0,0);
// rgb should be white
int rgb = (255 << 24);
for (int row = 0; row < BIM.getWidth(); row++)
{
for (int col = 0; col < BIM.getHeight(); col++)
{
p.setLocation(col, row);
if(!area.contains(p))
{
BIM.setRGB(col, row, rgb);
}
}
}
return BIM;
}
public static BufferedImage deepCopy(BufferedImage B2M)
{
ColorModel cm = B2M.getColorModel();
boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
WritableRaster raster = B2M.copyData(B2M.getRaster()
.createCompatibleWritableRaster());
return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
}
Это работало прекрасно (я был удивлен!) За исключением одной небольшой детали: линии области появились вокруг внешней стороны маскированного изображения.
Чтобы исправить это, я скопировал оригинальное (измененное) изображение перед операцией рисования. Большое спасибо user1050755 (ноябрь 2014) за рутину deepCopy , которую я нашел на этом сайте. Применение моей маски к скопированному изображению привело к той части исходного изображения, которую я хотел, без линий маски. Результат показан на прикрепленной картинке. Я в восторге!
Маскированное изображение