/* * Copyright 2017 Laszlo Balazs-Csiki * * This file is part of Pixelitor. Pixelitor is free software: you * can redistribute it and/or modify it under the terms of the GNU * General Public License, version 3 as published by the Free * Software Foundation. * * Pixelitor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Pixelitor. If not, see <http://www.gnu.org/licenses/>. */ package pixelitor.filters.jhlabsproxies; import pixelitor.filters.FilterWithParametrizedGUI; import pixelitor.filters.gui.IntChoiceParam; import pixelitor.filters.gui.IntChoiceParam.Value; import pixelitor.filters.gui.ParamSet; import pixelitor.filters.gui.RangeParam; import pixelitor.filters.gui.ShowOriginal; import pixelitor.filters.impl.MorphologyFilter; import pixelitor.utils.BasicProgressTracker; import pixelitor.utils.ProgressTracker; import java.awt.image.BufferedImage; import static pixelitor.filters.impl.MorphologyFilter.OP_DILATE; import static pixelitor.filters.impl.MorphologyFilter.OP_ERODE; /** * A morphology filter */ public class Morphology extends FilterWithParametrizedGUI { public static final String NAME = "Morphology"; private static final int OP_OPEN = 10; private static final int OP_CLOSE = 11; private final RangeParam radius = new RangeParam("Radius", 1, 1, 20); private final IntChoiceParam kernel = new IntChoiceParam("Kernel Shape", new Value[]{ new Value("Diamond", MorphologyFilter.KERNEL_DIAMOND), new Value("Square", MorphologyFilter.KERNEL_SQUARE), }); private final IntChoiceParam op = new IntChoiceParam("Operation", new Value[]{ new Value("Maximum (Dilate)", OP_DILATE), new Value("Minimum (Erode)", OP_ERODE), new Value("Open (Erode, then Dilate)", OP_OPEN), new Value("Close (Dilate, then Erode)", OP_CLOSE), }); public Morphology() { super(ShowOriginal.YES); setParamSet(new ParamSet(op, kernel, radius)); } @Override public BufferedImage doTransform(BufferedImage src, BufferedImage dest) { MorphologyFilter filter = new MorphologyFilter(NAME); int iterations = radius.getValue(); filter.setIterations(iterations); filter.setKernel(kernel.getValue()); int selectedOp = op.getValue(); if (selectedOp == OP_DILATE || selectedOp == OP_ERODE) { filter.setOp(selectedOp); dest = filter.filter(src, dest); } else { ProgressTracker pt = new BasicProgressTracker(NAME, 2 * iterations); filter.setProgressTracker(pt); if (selectedOp == OP_OPEN) { filter.setOp(OP_ERODE); dest = filter.filter(src, dest); filter.setOp(OP_DILATE); dest = filter.filter(dest, dest); } else if (selectedOp == OP_CLOSE) { filter.setOp(OP_DILATE); dest = filter.filter(src, dest); filter.setOp(OP_ERODE); dest = filter.filter(dest, dest); } else { throw new IllegalStateException("selectedOp = " + selectedOp); } pt.finish(); } return dest; } }