標籤:
為減少動畫製作過程中的IO操作,我們可以使用連續動畫來改善動畫播放效率。
如果我們對映像中的每張小映像單獨分割成獨立的檔案,那麼當每次要使用這些小映像的時候,我們都得從檔案中讀取映像資訊。
實際上我們可以利用Java將整張大映像中的每個小映像在應用程式中分割出來,然後使用的時候,直接從分割後的映像中擷取需要使用的小映像就可以了,這樣就不用每次都從檔案中讀取小映像資訊,效率自然會比較高。
那麼如何來實現映像分割操作呢?
樣本:
import java.awt.Component;
import java.awt.Image;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
/**
* 影像處理輔助類
*
* @author
*
*/
public class ImageUtil {
/**
* 分割映像
*
* @param image
* 傳入的圖片對象
* @param rows
* 垂直方向上需要裁剪出的圖片數量 - 行
* @param cols
* 水平方向上需要裁剪出的圖片數量 - 列
* @param x
* 開始裁剪位置的X座標
* @param y
* 開始裁剪位置的Y座標
* @param width
* 每次裁剪的圖片寬度
* @param height
* 每次裁剪的圖片高度
* @param changeX
* 每次需要改變的X座標數量
* @param changeY
* 每次需要改變的Y座標數量
* @param component
* 容器物件,目的是用來建立裁剪後的每個圖片對象
* @return 裁剪完並載入到記憶體後的二維圖片數組
*/
public static Image[][] cutImage(Image image, int rows, int cols, int x,
int y, int width, int height, int changeX, int changeY,
Component component) {
Image[][] images = new Image[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
ImageFilter filter = new CropImageFilter(x + j * changeX, y + i
* changeY, width, height);
images[i][j] = component.createImage(new FilteredImageSource(
image.getSource(), filter));
}
}
return images;
}
}
編寫一個專門分割映像的方法cutImage(),該方法中使用到的CropImageFilter類、FilteredImageSource類的詳情,大家可以參考JavaAPI文檔。
測試:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.JFrame;
import com.utils.ImageUtil;
/**
* 映像分割測試
*
* @author
*
*/
public class CutImageDemo extends JFrame {
private static final long serialVersionUID = 1140239462766935667L;
private MediaTracker mediaTracker;
private Image[][] images;
public CutImageDemo() {
setSize(800, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 建立媒體追蹤器對象
mediaTracker = new MediaTracker(this);
// 擷取源映像
Image image = Toolkit.getDefaultToolkit().getImage("images/Cg0430.jpg");
// 分割映像
images = ImageUtil.cutImage(image, 5, 5, 0, 3, 128, 95, 128, 95, this);
int index = 0;
// 將所有分割得到的映像添加到MediaTracker追蹤列表中
for (Image[] images2 : images) {
for (Image image2 : images2) {
mediaTracker.addImage(image2, index++);
}
}
setVisible(true);
}
@Override
public void paint(Graphics g) {
try {
// 載入所有映像
mediaTracker.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (mediaTracker.checkAll()) { // 所有映像載入完畢
// 迴圈將每張分割的映像繪製到表單中
for (int row = 0, len = images.length; row < len; row++) {
for (int col = 0, length = images[row].length; col < length; col++) {
Image img = images[row][col];
int imgWidth = img.getWidth(null);
int imgHeight = img.getHeight(null);
int x = col * (imgWidth + 10) + 15;
int y = row * (imgHeight + 15) + 40;
g.drawImage(img, x, y, null);
}
}
}
}
public static void main(String[] args) {
new CutImageDemo();
}
}
使用Java實現映像分割