四川科技职业学院毕业设计(论文)
第 23 页
图5.2.3
/**
* 将Image图像转换为Shape图形 *
* @param img * @param isFiltrate
* @return Image图像的Shape图形表示 * @author Hexen
*/
public Shape getImageShape(Image img) {
ArrayList
ArrayList
// 筛选像素
四川科技职业学院毕业设计(论文)
第 24 页
// 首先获取图像所有的像素信息
PixelGrabber pgr = new PixelGrabber(img, 0, 0, -1, -1, true); try {
pgr.grabPixels();
} catch (InterruptedException ex) { ex.getStackTrace(); }
int pixels[] = (int[]) pgr.getPixels();
// 循环像素
for (int i = 0; i < pixels.length; i++) {
// 筛选,将不透明的像素的坐标加入到坐标ArrayList x和y中 int alpha = getAlpha(pixels[i]); if (alpha == 0) { continue; } else {
x.add(i % width > 0 ? i % width - 1 : 0);
y.add(i % width == 0 ? (i == 0 ? 0 : i / width - 1) : i / width); } }
// 建立图像矩阵并初始化(0为透明,1为不透明) int[][] matrix = new int[height][width]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { matrix[i][j] = 0; } }
四川科技职业学院毕业设计(论文)
第 25 页
// 导入坐标ArrayList中的不透明坐标信息 for (int c = 0; c < x.size(); c++) { matrix[y.get(c)][x.get(c)] = 1; }
/*
* 逐一水平\扫描\图像矩阵的每一行,将不透明的像素生成为Rectangle,再将每一行的Rectangle通过Area类的rec对象进行合并,
* 最后形成一个完整的Shape图形 */
Area rec = new Area();
int temp = 0;
for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (matrix[i][j] == 1) { if (temp == 0) temp = j; else if (j == width) { if (temp == 0) {
Rectangle rectemp = new Rectangle(j, i, 1, 1);
rec.add(new Area(rectemp));
} else {
Rectangle rectemp = new Rectangle(temp, i,
j - temp, 1); rec.add(new Area(rectemp));
temp = 0;
} }
四川科技职业学院毕业设计(论文)
第 26 页
} else {
if (temp != 0) {
Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
rec.add(new Area(rectemp)); temp = 0; } } } temp = 0; } return rec; } /**
* 获取像素的Alpha值
*
* @param pixel
* @return 像素的Alpha值 */
private int getAlpha(int pixel) { return (pixel >> 24) & 0xff;
}
@Override
public void paint(Graphics g) {
// super.paint(g); //运行此行会导致鼠标进入窗体时窗口闪烁 g.drawImage(img, 0, 0, null); bf.repaint();
四川科技职业学院毕业设计(论文)
第 27 页
kj.repaint(); kt.repaint(); zt.repaint(); fh.repaint(); tj.repaint(); }
// public static void main(String[] args) { // repanl sample = new repanl(); // sample.setVisible(true); // }
5.2.4 播放模式功能实现
/**
* 随机播放 */
public static void randomSong() {
int randNumber = (int) (Math.random() * (defaultSongInfo.size() - 1)); initPlayer(defaultSongInfo.elementAt(randNumber));
start();
defaultSongList.setSelectedIndex(randNumber); }
5.2.5 歌词背景功能实现
歌词背景菜单包含风车,倾听,蒲公英,许愿,无背景,5个子菜单。如图5.2.5: