| XYWriter |

    package ij.plugin.filter;

    import java.awt.*;
    import java.awt.image.*;
    import java.util.Vector;
    import java.io.*;
    import ij.*;
    import ij.process.*;
    import ij.io.*;
    import ij.gui.*;
    import ij.measure.*;

    /** Saves the XY coordinates of the current ROI boundary. */
    public class XYWriter implements PlugInFilter {
        ImagePlus imp;

        public int setup(String arg, ImagePlus imp) {
            this.imp = imp;
            return DOES_ALL+ROI_REQUIRED+NO_CHANGES;
        }

        public void run(ImageProcessor ip) {
            try {
                saveXYCoordinates(imp);
            } catch (IllegalArgumentException e) {
                IJ.error("XYWriter", e.getMessage());
            }
        }

        public void saveXYCoordinates(ImagePlus imp) {
            Roi roi = imp.getRoi();
            if (roi==null)
                throw new IllegalArgumentException("ROI required");
            if (!(roi instanceof PolygonRoi))
                throw new IllegalArgumentException("Irregular area or line selection required");

            SaveDialog sd = new SaveDialog("Save Coordinates as Text...", imp.getTitle(), ".txt");
            String name = sd.getFileName();
            if (name == null)
                return;
            String directory = sd.getDirectory();
            PrintWriter pw = null;
            try {
                FileOutputStream fos = new FileOutputStream(directory+name);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                pw = new PrintWriter(bos);
            }
            catch (IOException e) {
                IJ.error("XYWriter", ""+e);
                return;
            }

            Rectangle r = roi.getBounds();
            PolygonRoi p = (PolygonRoi)roi;
            int n = p.getNCoordinates();
            int[] x = p.getXCoordinates();
            int[] y = p.getYCoordinates();

            Calibration cal = imp.getCalibration();
            String ls = System.getProperty("line.separator");
            boolean scaled = cal.scaled();
            for (int i=0; i<n; i++) {
                if (scaled)
                    pw.print(IJ.d2s((r.x+x[i])*cal.pixelWidth) + "\t" + IJ.d2s((r.y+y[i])*cal.pixelHeight) + ls);
                else
                    pw.print((r.x+x[i]) + "\t" + (r.y+y[i]) + ls);
            }
            pw.close();
        }

    }

| XYWriter |