需要下载Filters.jar包(http://www.jhlabs.com/index.html) package testshell; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Scale; import org.eclipse.swt.widgets.Shell; import com.jhlabs.image.MarbleFilter; public class TestShell extends Shell { private Canvas canvas; private static BufferedImage bi ; private int X = 0; private int Y = 0; private int Z = 0; private static Scale scale,scale_1,scale_2,scale_3; /** * Launch the application * @param args */ public static void main(String args[]) { try { bi = ImageIO.read(new FileInputStream("c://pic.gif"));//读入源图片 Display display = Display.getDefault(); TestShell shell = new TestShell(display, SWT.SHELL_TRIM); shell.open(); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } catch (Exception e) { e.printStackTrace(); } } /** * Create the shell * @param display * @param style */ public TestShell(Display display, int style) { super(display, style); createContents(); setLayout(new FormLayout()); } /** * Create contents of the window */ protected void createContents() { setText("SWT Application"); setSize(569, 515); canvas = new Canvas(this, SWT.NONE); final FormData fd_canvas = new FormData(); fd_canvas.bottom = new FormAttachment(0, 385); fd_canvas.top = new FormAttachment(0, 0); fd_canvas.right = new FormAttachment(0, 561); fd_canvas.left = new FormAttachment(0, 0); canvas.setLayoutData(fd_canvas); canvas.addPaintListener(new PaintListener(){ @Override public void paintControl(PaintEvent e) { paint(e); }} ); canvas.redraw(); final Composite composite = new Composite(this, SWT.NONE); final FormData fd_composite = new FormData(); fd_composite.top = new FormAttachment(100, -86); fd_composite.right = new FormAttachment(0, 550); fd_composite.bottom = new FormAttachment(100, -5); fd_composite.left = new FormAttachment(0, 6); composite.setLayoutData(fd_composite); composite.setLayout(new FormLayout()); scale = new Scale(composite, SWT.NONE); final FormData fd_scale = new FormData(); fd_scale.bottom = new FormAttachment(0, 55); fd_scale.right = new FormAttachment(0, 95); fd_scale.top = new FormAttachment(0, 13); fd_scale.left = new FormAttachment(0, 5); scale.setLayoutData(fd_scale); scale.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent arg0) { // TODO Auto-generated method stub X = scale.getSelection(); canvas.redraw(); }} ); scale_1 = new Scale(composite, SWT.NONE); final FormData fd_scale_1 = new FormData(); fd_scale_1.top = new FormAttachment(scale, -42, SWT.BOTTOM); fd_scale_1.bottom = new FormAttachment(scale, 0, SWT.BOTTOM); fd_scale_1.left = new FormAttachment(0, 105); scale_1.setLayoutData(fd_scale_1); scale_1.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent arg0) { // TODO Auto-generated method stub Y = scale_1.getSelection(); canvas.redraw(); }} ); scale_2 = new Scale(composite, SWT.NONE); fd_scale_1.right = new FormAttachment(scale_2, -5, SWT.LEFT); final FormData fd_scale_2 = new FormData(); fd_scale_2.right = new FormAttachment(0, 295); fd_scale_2.top = new FormAttachment(scale_1, -42, SWT.BOTTOM); fd_scale_2.bottom = new FormAttachment(scale_1, 0, SWT.BOTTOM); fd_scale_2.left = new FormAttachment(0, 200); scale_2.setLayoutData(fd_scale_2); scale_2.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent arg0) { // TODO Auto-generated method stub Z = scale_2.getSelection(); canvas.redraw(); }} ); scale_3 = new Scale(composite, SWT.NONE); final FormData fd_scale_3 = new FormData(); fd_scale_3.left = new FormAttachment(0, 315); fd_scale_3.right = new FormAttachment(0, 410); fd_scale_3.bottom = new FormAttachment(scale_2, 42, SWT.TOP); fd_scale_3.top = new FormAttachment(scale_2, 0, SWT.TOP); scale_3.setLayoutData(fd_scale_3); final Scale scale_4 = new Scale(composite, SWT.NONE); final FormData fd_scale_4 = new FormData(); fd_scale_4.left = new FormAttachment(0, 430); fd_scale_4.bottom = new FormAttachment(0, 57); fd_scale_4.top = new FormAttachment(0, 15); fd_scale_4.right = new FormAttachment(0, 520); scale_4.setLayoutData(fd_scale_4); // } private void paint(PaintEvent e){ try { BufferedImage kbi = new BufferedImage(bi.getWidth(), bi.getHeight(),BufferedImage.TYPE_INT_RGB); ByteArrayOutputStream bs = new ByteArrayOutputStream(); ImageOutputStream imOut = ImageIO.createImageOutputStream(bs); if(X+Y+Z==0){ ImageIO.write(bi, "gif", imOut); }else{ MarbleFilter mf = new MarbleFilter(); mf.setTurbulence(mf.getTurbulence()+Z); mf.setXScale(mf.getXScale()+X); mf.setYScale(mf.getYScale()+Y); ImageIO.write(mf.filter(bi,kbi), "gif", imOut); } InputStream is = new ByteArrayInputStream(bs.toByteArray()); ImageData id = new ImageData(is); Image image = new Image(e.display, id); e.gc.drawImage(image, 50, 50); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } @Override protected void checkSubclass() { // Disable the check that prevents subclassing of SWT components } }