用java普通类合并图片合并出来的质量不怎么好,想用JMagick合并。
怎样可以合并呢?最好有原码?? (分数没了,以后再还大家!)

解决方案 »

  1.   

    package pic;import java.awt.*;
    import java.io.*;
    import java.net.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import javax.swing.*;public class effect
        extends JApplet
        implements Runnable {
      //定义变量
      Toolkit toolkit;
      int totalBlocks = 0; //图像被分解成的块数,默认为 宽X高
      int[] blocks; //保存块数的信息
      Image[] bufferImage = new Image[2]; //屏幕上的图形缓冲
      VolatileImage offScreenImage;
      Image imageBuf; //保存图片缓冲区内容
      Graphics2D offScreenGraphics;
      Thread thread;
      MediaTracker mediaTracker;
      boolean[] isImageReady; //图片是否已经装载
      MemoryImageSource memoryimagesource;
      int imageWidth, imageHeight; //图像的宽及高
      int[] pixelA, pixelB;
      int[] redA, greenA, blueA, redB, greenB, blueB;  public effect() throws HeadlessException {
        bufferImage[0] = getImage("a.jpg");
        bufferImage[1] = getImage("b.jpg");
        if ( (bufferImage[0].getWidth(this) != bufferImage[1].getWidth(this)) ||
            (bufferImage[0].getHeight(this) != bufferImage[1].getHeight(this))) {
          System.out.println("图像尺寸不一致!");
          return;
        }    toolkit = getToolkit();
        imageWidth = bufferImage[0].getWidth(this);
        imageHeight = bufferImage[0].getHeight(this);
        totalBlocks = imageWidth * imageHeight; //计算分解的块数
        blocks = new int[totalBlocks];
        pixelA = new int[totalBlocks];
        pixelB = new int[totalBlocks];
        redA = new int[totalBlocks];
        greenA = new int[totalBlocks];
        blueA = new int[totalBlocks];
        redB = new int[totalBlocks];
        greenB = new int[totalBlocks];
        blueB = new int[totalBlocks];    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        GraphicsConfiguration gc = gd.getDefaultConfiguration();
        offScreenImage = gc.createCompatibleVolatileImage(imageWidth, imageHeight); //创建图像缓冲
        offScreenGraphics = offScreenImage.createGraphics(); //取得缓冲的graphics对象
      }  public void init() {
        getImagePixels(bufferImage[0], pixelA);
        getImagePixels(bufferImage[1], pixelB);
        for (int i = 0; i < totalBlocks; i++) {
          blocks[i] = pixelA[i]; //保存图像A的像素信息
          redA[i] = pixelA[i] & 0xff0000; //保存图像B的red值
          greenA[i] = pixelA[i] & 0x00ff00; //保存图像B的green值
          blueA[i] = pixelA[i] & 0x0000ff; //保存图像B的blue值      redB[i] = pixelB[i] & 0xff0000; //保存图像B的red值
          greenB[i] = pixelB[i] & 0x00ff00; //保存图像B的green值
          blueB[i] = pixelB[i] & 0x0000ff; //保存图像B的blue值
        }
        prepareImagePixels(); //将像素信息还原为图像
      }  public void run() {
        //检查java版本
        String javaVersion;
        try {
          javaVersion = System.getProperty("java.version");
        }
        catch (SecurityException _ex) {
          javaVersion = "unk";
        }
        if (javaVersion.startsWith("1.0")) {
          System.out.println("require java 1.1 or later version!");
          return;
        }    try {
          thread.sleep(3000l);
        }
        catch (InterruptedException ex1) {
        }    int line = 0;
        Thread currentThread = Thread.currentThread();    while (line < imageHeight && thread == currentThread) {
          for (int i = 0; i < imageWidth; i++) {
            int offset = line * imageWidth + i;
            blocks[offset] = pixelB[offset]; //与下一被注释的语句作用相同
            //blocks[offset] = redB[offset] | greenB[offset] | blueB[offset];
          }      memoryimagesource.newPixels(); //生成新的图像
          line++;
          repaint();      //适当延时
          try {
            thread.sleep(20l);
          }
          catch (InterruptedException ex) {
          }    }
      }  public void paint(Graphics g) {
        if (offScreenGraphics != null) { //保证在destory()时不引发异常
          offScreenGraphics.drawImage(imageBuf, 0, 0, this);
          g.drawImage(offScreenImage, 0, 0, this);
        }
      }  public void start() {
        if (thread == null) {
          thread = new Thread(this);
          thread.start();
        }
      }  public void stop() {
        thread = null;
      }  public final void update(Graphics g) {
        paint(g);
      }  public void destroy() {
        if (offScreenImage != null) {
          offScreenImage.flush();
        }
        offScreenImage = null;
        if (offScreenGraphics != null) {
          offScreenGraphics.dispose();
        }
        offScreenGraphics = null;
        System.gc();
      }  /**
       * 通过给定的文件名获得图像
       * @param filename 给定图像的文件名
       * @return 图像
       */
      Image getImage(String filename) {
        URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();
        URL url = null;
        Image image = null;
        url = urlLoader.findResource(filename);
        image = Toolkit.getDefaultToolkit().getImage(url);
        MediaTracker mediatracker = new MediaTracker(this);
        try {
          mediatracker.addImage(image, 0);
          mediatracker.waitForID(0);
        }
        catch (InterruptedException _ex) {
          image = null;
        }
        if (mediatracker.isErrorID(0)) {
          image = null;
        }    return image;
      }  /**
       * 取得给定图像的像素数组
       * @param image 指定的图像
       * @param pixels 保存像素信息的数组
       * @return 成功返回true
       */
      private boolean getImagePixels(Image image, int pixels[]) {
        PixelGrabber pixelgrabber = new PixelGrabber(image, 0, 0, imageWidth,
                                                     imageHeight, pixels,
                                                     0, imageWidth);
        try {
          pixelgrabber.grabPixels();
        }
        catch (InterruptedException _ex) {
          return false;
        }
        return true;
      }  /**
       * 将像素数组还原为图像
       */
      void prepareImagePixels() {
        memoryimagesource = new MemoryImageSource(imageWidth, imageHeight,
                                                  new DirectColorModel(24, 0xff0000,
            0x00ff00, 0x0000ff), blocks, 0, imageWidth);
        try {
          memoryimagesource.setAnimated(true);
          memoryimagesource.setFullBufferUpdates(true);
          imageBuf = createImage(memoryimagesource);
          memoryimagesource.newPixels(); //生成新的图像
        }
        catch (NoSuchMethodError _ex) {    }
      }  /**
       * 取得图像的宽度
       * @return 宽度
       */
      public int getWidth() {
        return imageWidth;
      }  /**
       * 取得图像的高度
       * @return 高度
       */
      public int getHeight() {
        return imageHeight;
      }  public static void main(String args[]) {
        JFrame frame = new JFrame("Demo");
        effect e = new effect();
        e.init();
        e.start();
        frame.getContentPane().setLayout(new BorderLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.getContentPane().add(e);
        frame.setSize(new Dimension(e.getWidth() + 6, e.getHeight() + 20));
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = frame.getSize();
        frame.setLocation( (screenSize.width - frameSize.width) / 2,
                          (screenSize.height - frameSize.height) / 2);
        frame.show();
      }}
    不知这行不行,就是用两幅图片的像素来合成一张图片,然后显示,且是动态的.网上下的.
      

  2.   

    用常用的方法很简单就可以合并拉! 我是想用JMagick合并两幅图片。因为图片是用来冲洗照片的,质量要很好才行!!所以要用JMagick包,但不知道怎样可以合并??