⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 effect.java

📁 一个简单的APPLET的程序,实现了图象渐变过程,是个很少见也很不错的web特效!
💻 JAVA
字号:
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();
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -