001 /* 002 * Mirror 003 * 004 * Copyright (c) 2001, 2002, 2003 Marco Schmidt. 005 * All rights reserved. 006 */ 007 008 package net.sourceforge.jiu.geometry; 009 010 import net.sourceforge.jiu.data.IntegerImage; 011 import net.sourceforge.jiu.data.PixelImage; 012 import net.sourceforge.jiu.ops.ImageToImageOperation; 013 import net.sourceforge.jiu.ops.MissingParameterException; 014 import net.sourceforge.jiu.ops.WrongParameterException; 015 016 /** 017 * Mirrors images (leftmost column becomes rightmost column and vice versa, and so on). 018 * <p> 019 * Supported image types: {@link IntegerImage}. 020 * <h3>Usage example</h3> 021 * <pre> 022 * PixelImage image = ...; // something implementing IntegerImage 023 * Mirror mirror = new Mirror(); 024 * mirror.setInputImage(image); 025 * mirror.process(); 026 * PixelImage mirroredImage = mirror.getOutputImage(); 027 * </pre> 028 * @author Marco Schmidt 029 */ 030 public class Mirror extends ImageToImageOperation 031 { 032 private void process(IntegerImage in, IntegerImage out) 033 { 034 final int WIDTH = in.getWidth(); 035 final int HEIGHT = in.getHeight(); 036 if (out == null) 037 { 038 out = (IntegerImage)in.createCompatibleImage(WIDTH, HEIGHT); 039 setOutputImage(out); 040 } 041 int totalItems = in.getNumChannels() * WIDTH; 042 int processedItems = 0; 043 for (int c = 0; c < in.getNumChannels(); c++) 044 { 045 for (int x1 = 0, x2 = WIDTH - 1; x1 < WIDTH; x1++, x2--) 046 { 047 for (int y = 0; y < HEIGHT; y++) 048 { 049 out.putSample(c, x2, y, in.getSample(c, x1, y)); 050 } 051 setProgress(processedItems++, totalItems); 052 } 053 } 054 } 055 056 public void process() throws 057 MissingParameterException, 058 WrongParameterException 059 { 060 ensureInputImageIsAvailable(); 061 ensureImagesHaveSameResolution(); 062 PixelImage in = getInputImage(); 063 if (in instanceof IntegerImage) 064 { 065 process((IntegerImage)in, (IntegerImage)getOutputImage()); 066 } 067 else 068 { 069 throw new WrongParameterException("Input image must be of type IntegerImage."); 070 } 071 } 072 }