使用Java實現映像分割

來源:互聯網
上載者:User

標籤:

為減少動畫製作過程中的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實現映像分割

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.