`

Java动画程序,图片分割成小块再汇聚

    博客分类:
  • Java
阅读更多



应用程序入口

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


@SuppressWarnings("serial")
public class DrawNameOnBg extends JFrame {

	private JTextField textFrameRate;
	private JTextField textBlockSize;
	private JPanel panel;
//	private   PicPanel picPanel = new PicPanel();
	private   PicPanelUseBuffer picPanel = new PicPanelUseBuffer();
	
	public DrawNameOnBg() {
		setUndecorated(true);		
		getContentPane().setLayout(new BorderLayout());
		getContentPane().add(picPanel,BorderLayout.CENTER);
		getContentPane().add(getPanel(), BorderLayout.SOUTH);
		this.pack();//自动调整窗口大小	
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);//移至屏幕中心
		setVisible(true);
	}


	
	public static void main(String[] args) {
		new DrawNameOnBg();
	}
	/**
	 * @return 按钮面板
	 */
	protected JPanel getPanel() {
		if (panel == null) {
			panel = new JPanel();
			//帧率 
			final JLabel label_1 = new JLabel();
			label_1.setText("帧率:");
			panel.add(label_1);
			
			textFrameRate = new JTextField();
			textFrameRate.setText("20        ");
			panel.add(textFrameRate);
			
			//块大小
			final JLabel label = new JLabel();
			label.setText("块大小:");
			panel.add(label);

			textBlockSize = new JTextField();
			textBlockSize.setText(picPanel.subImWidth+"          ");
			textBlockSize.setMinimumSize(new Dimension(30, 20));
			panel.add(textBlockSize);
		
			//演示按钮
			final JButton buttonShow = new JButton();
			buttonShow.addActionListener(new ActionListener() {
				public void actionPerformed(final ActionEvent e) {
						new Thread(){
						@Override
						public void run() {
							try {
								int temp = Integer.valueOf(textBlockSize.getText().trim());
								picPanel.subImWidth=temp;
								picPanel.subImWidth=temp<5?5:temp;
								picPanel.subImWidth=temp>120?120:picPanel.subImWidth;
								textBlockSize.setText(String.valueOf(picPanel.subImWidth));
							} catch (Exception e2) {
								textBlockSize.setText(String.valueOf(picPanel.subImWidth));
							}
							try {
								int temp = Integer.valueOf(textFrameRate.getText().trim());
								if(temp<1)
								picPanel.frameRate=1;
								
								else if(temp>24)	picPanel.frameRate=24;
								else picPanel.frameRate=temp;
								textFrameRate.setText(String.valueOf(picPanel.frameRate));
								
							} catch (Exception e2) {
								textFrameRate.setText(String.valueOf(picPanel.frameRate));
							}
							
							
							picPanel.restart();						
						}}.start();
					

				}
			});
			panel.add(buttonShow);
			buttonShow.setText("演示");
			//退出按钮
			final JButton buttonExit = new JButton();
			buttonExit.addActionListener(new ActionListener() {
				public void actionPerformed(final ActionEvent e) {
					System.exit(0);
				}
			});
			buttonExit.setText("退出");
			panel.add(buttonExit);
			//旋转复选框
			final JCheckBox checkBoxRotate = new JCheckBox();
			checkBoxRotate.setSelected(picPanel.rotate);
			checkBoxRotate.addActionListener(new ActionListener() {
				public void actionPerformed(final ActionEvent e) {
					picPanel.rotate=!picPanel.rotate;
				}
			});
			checkBoxRotate.setText("旋转");
			panel.add(checkBoxRotate);
		}
		return panel;
	}
	

}

主要的Jpanel

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class PicPanelUseBuffer extends JPanel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	BufferedImage bgIm, nameIm;//背景图片和名字图片
	BufferedImage[][][] nameSubIms;//分割后的图片,最后一维为各个方向的图片
	Point posCenters[][];//各个小图的中心坐标
	int subImWidth = 7;//分割后图片的宽度
	int x;		//名字图片的左上角坐标
	int y = 30;
	int xCenter;//汇聚中心坐标
	int yCenter = -30;
	int frames = 50;//帧数
	boolean act = false;//是否动画,控制绘图用
	int currentFrame;//当前帧
	final int coefficient = 10;//将汇聚中心到小图的距离分为10份,作为小图移动的步长
	int frameRate = 20;//帧率
	AffineTransform tr; //仿射变换对象
	final int directionNum = 8;//图片旋转方向数目
	int direction = 0;//当前帧绘制的图片的方向的序号
	boolean rotate = true;//控制是否旋转

	public PicPanelUseBuffer() {
		try {
			setDoubleBuffered(true);
			bgIm = ImageIO.read(new File("bg.jpg"));
			//在背景上写上名字和E-mail
			Graphics2D g = bgIm.createGraphics();
			g.setColor(Color.BLUE);
			g.setXORMode(Color.white);
			g.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 20));
			g.drawString("制作:2009310399 梁超 @ 清华", 5, g.getFontMetrics().getHeight());
			String email = "E-mail: essay1986@yahoo.com.cn";
			g.drawString(email, bgIm.getWidth()
					- SwingUtilities.computeStringWidth(g.getFontMetrics(), email) - 5, bgIm
					.getHeight() - 10);
			g.dispose();
			
			nameIm = ImageIO.read(new File("name.png"));
			x = (bgIm.getWidth() - nameIm.getWidth()) >> 1;//使得名字绘制在中心
			xCenter = bgIm.getWidth() / 2;
			tr = new AffineTransform();

			init();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void init() {//初始化分割后的图像
		nameSubIms = new BufferedImage[nameIm.getHeight() / subImWidth][nameIm.getWidth()
				/ subImWidth][directionNum];
		posCenters = new Point[nameSubIms.length][nameSubIms[0].length];

		for (int i = 0; i < nameSubIms.length; i++) {
			for (int j = 0; j < nameSubIms[i].length; j++) {
				nameSubIms[i][j][0] = nameIm.getSubimage(j * subImWidth, i * subImWidth,
						subImWidth, subImWidth);//旋转前的图像

				int xC = x + j * subImWidth + (subImWidth >> 1);//小图的中心坐标
				int yC = y + i * subImWidth + (subImWidth >> 1);
				// System.out.println(xC+"    "+yC+"    "+(xC -
				// xCenter)+"   "+(yC - yCenter));
				posCenters[i][j] = new Point(xC - xCenter, yC - yCenter);//到汇聚中心的向量
				for (int k = 1; k < nameSubIms[i][j].length; k++) {//产生各个方向的图片,注意由于旋转后图片变大,有删减
					nameSubIms[i][j][k] = new BufferedImage(subImWidth, subImWidth,
							BufferedImage.TYPE_INT_ARGB_PRE);
					Graphics2D g = nameSubIms[i][j][k].createGraphics();
					double angle = Math.PI * 2 / directionNum * k;
					if (xC < xCenter)
						angle = -angle;
//					tr.rotate(angle, subImWidth / 2, subImWidth / 2);
					tr.setToRotation(angle, subImWidth / 2, subImWidth / 2);
					g.drawImage(nameSubIms[i][j][0], tr, this);

					// System.out.println(nameSubIms[i][j][k]+"   "+subImWidth);
				}
			}
		}

	}

	@Override
	public void paint(Graphics g) {
//		final float alphaLow = 0.7f;
		super.paint(g);
		g.drawImage(bgIm, 0, 0, this);//绘制背景
		Graphics2D g2 = (Graphics2D) (g);
		if (act) {//动画时
			currentFrame--;
			direction++;//改变分割图片的方向
			if (direction >= directionNum)
				direction = 0;

			//绘制分割后的图片
			for (int j = 0; j < nameSubIms.length; j++) {
				for (int k = 0; k < nameSubIms[j].length; k++) {
					int xPos = xCenter + posCenters[j][k].x * Math.abs(currentFrame) / coefficient
							- (subImWidth >> 1);// + (int) ((Math.random() -
												// 0.5) * subImWidth);
					int yPos = yCenter + posCenters[j][k].y * Math.abs(currentFrame) / coefficient
							- (subImWidth >> 1);// + (int) ((Math.random() -
												// 0.5) * subImWidth);

					tr.setToTranslation(xPos, yPos);
					if (rotate)
						g2.drawImage(nameSubIms[j][k][direction], tr, this);
					else
						g2.drawImage(nameSubIms[j][k][0], tr, this);
					;
				}
			}

		} else {
			// ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
			// alphaLow);
			// g2.setComposite(ac);
			g2.drawImage(nameIm, x, y, this);
		}
	}

	public void restart() {
		if (subImWidth != nameSubIms[0][0][0].getWidth())//改变分割图像大小,重新初始化
			init();

		act = true;
		currentFrame = frames;
		while(currentFrame > -coefficient) {
			try {
				Thread.sleep(1000 / frameRate);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			repaint();
		}
		act = false;
		repaint();

	}

	@Override
	public void update(Graphics g) {
		repaint();
	}

	@Override
	public Dimension getPreferredSize() {

		return new Dimension(bgIm.getWidth(), bgIm.getHeight());
	}
}
  • 大小: 503.1 KB
  • draw.rar (310.6 KB)
  • 描述: 源代码
  • 下载次数: 70
分享到:
评论

相关推荐

    JS+CSS3 3D图片分割拼接动画特效

    【JS+CSS3 3D图片分割拼接动画特效】是一种在网页中通过JavaScript和CSS3技术实现的创新视觉效果。这种特效将图片分解成多个3D片段,并通过动态拼接来创造出引人入胜的视觉体验。接下来,我们将深入探讨这一特效背后...

    java 分割文件 将大文件分割成小文件

    以下是一个简单的示例,展示了如何将文件分割成固定大小的小块: ```java import java.io.*; public class FileSplitter { public static void splitBySize(String sourceFilePath, int blockSizeInBytes) { try...

    java实现文件的分割.rar

    本示例“java实现文件的分割.rar”提供的SplitFile程序,利用了Java的随机访问流(RandomAccessFile)来实现文件的切割。下面我们将深入探讨这个过程涉及的关键知识点。 1. **随机访问流(RandomAccessFile)**: Java...

    Java语言程序设计(基础篇)习题答案

    "Java语言程序设计(基础篇)习题答案"是一份针对初学者的重要参考资料,它旨在帮助学习者巩固Java基础知识,理解并掌握核心概念。这份资料可能包含一系列与Java编程相关的练习题及其解答,涵盖变量、数据类型、控制...

    java拼图游戏程序

    【Java拼图游戏程序】是一种基于Java编程语言开发的互动娱乐软件,主要目的是提供一个智力挑战,让玩家通过移动和旋转各个小块来重组一幅完整的图像。这种游戏通常以图像碎片的形式呈现,玩家需要利用逻辑思维和空间...

    图片分割做网站必备

    通过将大图分割成若干小块,我们可以分别加载这些小图片,从而加快页面的加载速度,尤其是在网络带宽有限的情况下。 "Picture Split"这个软件很可能就是这样一个实用工具,它可以自动根据用户的需求,无论是按数量...

    完整的java拼图程序

    2. 图片分割:为了创建拼图,程序需要将图片切割成多个部分。这可能涉及到图像处理算法,如二维数组来存储每个小块的位置和图像数据。 3. 用户交互:游戏需要响应用户的鼠标点击事件,允许用户选择和移动拼图块。这...

    java编写的拼图程序

    1. 图像处理:在这个Java程序中,原始图片被分割成多个小块,这可能使用了Java的`BufferedImage`类和图像处理库,如Java Advanced Imaging (JAI) 或 Apache Commons Imaging。开发者可能通过计算图像的宽度和高度来...

    百度地图瓦片工具(JAVA完整工程)

    在GIS(地理信息系统)领域,地图瓦片是一种将大尺寸地图分割成小块图片的技术,通常用于提高网络地图服务的加载速度和显示效率。这个JAVA工程提供了一整套解决方案,可以帮助用户生成、裁剪、管理和使用百度地图的...

    图片分割器

    【图片分割器】是一款基于C#编程语言开发的实用工具,专用于将一张大尺寸的图像等比例地分割成多张小图片。这个程序的主要功能是解决用户在处理大型图像时遇到的问题,如需要批量裁剪或分别处理图像的各个部分。通过...

    文件分割合并程序

    在日常工作中,我们可能遇到需要将一个大文件分成小块以便于传输、存储或管理的情况,或者需要将这些小块再重新组合成原始文件。这个程序就是为了解决这样的问题而设计的。 在描述中提到了“.pp”文件格式,这是一...

    均匀分割逼近图像,该程序用C++Builder编写,对图像进行了均匀分割成很多小块,每一小块的像素点灰度值有该小块灰度平均值所取代,得到图像均匀逼近的效果

    总结来说,这个程序展示了如何使用C++Builder实现图像的均匀分割逼近,通过将图像分割成小块并用平均灰度值替换像素点,达到平滑图像、改变视觉效果的目的。这种技术在许多应用中都有用武之地,比如图像去噪、简化...

    整合图片分割、切割、.net效果

    **图片分割**是图像处理中的一个关键步骤,它通常指的是将一幅图像分解成多个有意义的部分或区域。在实际应用中,这可以用于图像识别、对象检测、医疗影像分析等。图片分割技术包括像素级分割、区域生长、边缘检测等...

    atom图片分割器

    在美工设计领域,Atom图片分割器能够帮助设计师快速处理大图,例如将背景图片分割成多个小块,以便在网页或应用中实现平滑的滚动效果。同时,对于需要在不同平台上展示的设计作品,如手机壁纸、社交媒体封面等,通过...

    图片分割软件

    通过图片分割,可以将大图切成若干个小块,每个小块适合小屏幕显示或打印,然后按照顺序组合,就能复原整张大图。这种方式使得用户可以在有限的硬件条件下欣赏或打印高分辨率的图像。 图片分割软件通常具备以下功能...

    文件分割分割文件小程序

    本小程序“文件分割分割文件小程序”专注于这一功能,提供了便捷的文件分割与复原服务。 首先,我们来详细了解文件分割的概念。文件分割是指将一个大文件拆分成若干个小文件,每个小文件的大小可以根据需要进行设定...

    falsh图片分割

    通过图片分割,我们可以将一张完整的人物图片分割成多个部分,比如上半身和下半身,然后分别对这些部分进行独立的动画处理。这样可以降低内存消耗,因为只需要存储和显示必要的部分,而不是整个角色的每一帧。 在...

Global site tag (gtag.js) - Google Analytics