ImageViewer

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.MenuItem;
import java.awt.Point;
import java.awt.PopupMenu;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;


public class ImageViewer2
{
	private static double ZoomStep = 0.2;
	private static int SwitchStep = 10;
	
	private static final Dimension Screen_Bounds = Toolkit.getDefaultToolkit().getScreenSize();
	private static Image CurrImage=null, img1, img2;
	private static boolean inAction=false, inDraw=false;
	private static Frame frame = null;
	private static final int MaxSize_Width=Screen_Bounds.width*3/4,MaxSize_Height=Screen_Bounds.height*3/4;
	private static int currentImageIndex=0, nextImageIndex=0;
	private static File imageFolder = null;
	private static String[] imgFileList = null;
	private static final String Image_Type = "jpg;bmp;png;gif;jpeg;";

	public static void main(String[] args)
	{
		args = new String[]{"C:/Data/1.bmp"};
		if(args.length==0 || args[0]==null)
			return;
		frame = new Frame(){
			private static final long serialVersionUID = 1L;
			public void paint(Graphics g)
			{
				if(CurrImage!=null)
				{
					g.drawImage(CurrImage.img, 3,3,CurrImage.viewWidth,CurrImage.viewHeight,
							0,0,CurrImage.getWidth(),CurrImage.getHeight(),null);
				}
				inDraw=false;
			}
		};
		frame.setUndecorated(true);
		frame.setBackground(Color.BLACK);
		img1 = loadImage(args[0]);
		CurrImage = img1;
		CurrImage.viewWidth = CurrImage.viewHeight = 1;
		frame.setLocation((Screen_Bounds.width-CurrImage.getWidth())/2, (Screen_Bounds.height-CurrImage.getHeight())/2);
		frame.setSize(1, 1);
		
		frame.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e) { exitProgram(); }});
		OperationAdapter operater = new OperationAdapter();
		frame.addKeyListener(operater);
		frame.addMouseListener(operater);
		frame.addMouseMotionListener(operater);
		frame.addMouseWheelListener(operater);
		frame.setVisible(true);
		
		zoomTo(getImageScaleByScreenLimit(CurrImage, 1));
		
		File img = new File(args[0]);
		imageFolder = img.getParentFile();
		imgFileList = imageFolder.list();
		for(int i=0; i<imgFileList.length; i++)
		{
			if(imgFileList[i].equals(img.getName()))
				currentImageIndex = i;
		}
		loadNextImage();
	}
	
	public static synchronized void setViewSize(double scale)
	{
		if(scale<0)
			return;
		CurrImage.viewWidth = (int)(CurrImage.getWidth()*scale);
		CurrImage.viewHeight = (int)(CurrImage.getHeight()*scale);
		inDraw=true;
		frame.setSize(CurrImage.viewWidth+3, CurrImage.viewHeight+3);
		frame.update(frame.getGraphics());
		while(inDraw);
		//frame.setLocation((Screen_Bounds.width-CurrImage.viewWidth)/2, (Screen_Bounds.height-CurrImage.viewHeight)/2);
	}
	
	public static Image loadImage(String filePath)
	{
		inAction=true;
		File imgFile = new File(filePath);
		if(!imgFile.exists() || imgFile.isDirectory())
			return null;
		Image img = new Image();
		try {
			img.img = ImageIO.read(imgFile);
			int w=img.getWidth();
			int h=img.getHeight();
			if(w > h*MaxSize_Width/MaxSize_Height)
			{
				img.viewWidth=w>MaxSize_Width?MaxSize_Width:w;
				img.viewHeight=h*img.viewWidth/w;
			}
			else
			{
				img.viewWidth=w>MaxSize_Width?MaxSize_Width:w;
				img.viewHeight=h*img.viewWidth/w;
			}
		} catch (Exception e) {
			img=null;
			e.printStackTrace();
		}
		if(img==null)
		{
			/*TODO: load error image*/
		}
		inAction=false;
		return img;
	}
	
	public static void loadLastImage()
	{
		if(imageFolder==null || !imageFolder.isDirectory())
			return;
		inAction=true;
		for(nextImageIndex=currentImageIndex-1;;nextImageIndex--)
		{
			if(nextImageIndex<0)
				nextImageIndex=imgFileList.length-1;
			if(nextImageIndex==currentImageIndex)
				break;
			if(Image_Type.indexOf(imgFileList[nextImageIndex].substring(imgFileList[nextImageIndex].lastIndexOf(".")+1).toLowerCase())>-1
					&& !new File(imageFolder.getAbsolutePath()+"/"+imgFileList[nextImageIndex]).isDirectory())
			{
				break;
			}
		}
		if(CurrImage==img1)
			img2 = loadImage(imageFolder.getAbsolutePath()+"/"+imgFileList[nextImageIndex]);
		else
			img1 = loadImage(imageFolder.getAbsolutePath()+"/"+imgFileList[nextImageIndex]);
		inAction=false;
	
	}
	
	public static void loadNextImage()
	{
		if(imageFolder==null || !imageFolder.isDirectory())
			return;
		inAction=true;
		for(nextImageIndex=currentImageIndex+1;;nextImageIndex++)
		{
			if(nextImageIndex>=imgFileList.length)
				nextImageIndex=0;
			if(nextImageIndex==currentImageIndex)
				break;
			if(Image_Type.indexOf(imgFileList[nextImageIndex].substring(imgFileList[nextImageIndex].lastIndexOf(".")+1).toLowerCase())>-1
					&& !new File(imageFolder.getAbsolutePath()+"/"+imgFileList[nextImageIndex]).isDirectory())
			{
				break;
			}
		}
		if(CurrImage==img1)
			img2 = loadImage(imageFolder.getAbsolutePath()+"/"+imgFileList[nextImageIndex]);
		else
			img1 = loadImage(imageFolder.getAbsolutePath()+"/"+imgFileList[nextImageIndex]);
		inAction=false;
	}
	
	public static double getImageScaleByScreenLimit(Image img, double screenScale)
	{
		int screenwidth=(int)(MaxSize_Width*screenScale);
		int screenHeight=(int)(MaxSize_Height*screenScale);
		if(img.getWidth() > img.getHeight()*screenwidth/screenHeight)
		{
			if(img.getWidth()>screenwidth)
				return screenwidth/img.getWidth();
			else
				return 1;
		}
		else
		{
			if(img.getHeight()>screenHeight)
				return screenHeight/img.getHeight();
			else
				return 1;
		}
	}
	
	public static void zoomTo(double imgScale)
	{
		inAction=true;
		double cur_scale = (double)CurrImage.viewWidth/(double)CurrImage.getWidth();
		if(cur_scale<imgScale)
		{
			for(double scale=cur_scale; scale<imgScale; scale+=0.02)
			{
				setViewSize(scale);
				try {
					Thread.sleep(1);
				} catch(Exception e){}
			}
		}
		else if(cur_scale>imgScale)
		{
			for(double scale=cur_scale; scale>imgScale; scale-=0.02)
			{
				setViewSize(scale);
				try {
					Thread.sleep(1);
				} catch(Exception e){}
			}
		}
		inAction=false;
	}
	
	public static void switchImage(boolean isNormal)
	{
		inAction=true;
		int ms = (int)((Screen_Bounds.width+CurrImage.getWidth())/(2*SwitchStep));
		if(isNormal)
		{
			loadLastImage();
			for(int i=0; i<SwitchStep; i++)
			{
				frame.setLocation(frame.getX()-ms, frame.getY());
				try {
					Thread.sleep(10);
				} catch(Exception e){}
			}
		}
		else
		{
			for(int i=0; i<SwitchStep; i++)
			{
				frame.setLocation(frame.getX()+ms, frame.getY());
				try {
					Thread.sleep(10);
				} catch(Exception e){}
			}
		}
		CurrImage=CurrImage==img1?img2:img1;
		inDraw=true;
		frame.setSize(CurrImage.viewWidth+3, CurrImage.viewHeight+3);
		frame.update(frame.getGraphics());
		while(inDraw);
		frame.setLocation((Screen_Bounds.width-CurrImage.getWidth())/2, (Screen_Bounds.height-CurrImage.getHeight())/2);
		currentImageIndex=nextImageIndex;
		loadNextImage();
		inAction=false;
	}
	
	public static void exitProgram()
	{
		zoomTo(0.1);
		System.exit(0);
	}
	
	private static class Image
	{
		public BufferedImage img;
		public int viewWidth, viewHeight;
		
		public int getWidth()
		{
			return img.getWidth();
		}
		
		public int getHeight()
		{
			return img.getHeight();
		}
	}
	
	private static class OperationAdapter implements KeyListener,MouseListener,MouseMotionListener,MouseWheelListener
	{
		public Point pOnFrame=null;
		public PopupMenu popupMenu = null;
		
		public OperationAdapter()
		{
			popupMenu = new PopupMenu();
			
			MenuItem menu_rotateL = new MenuItem();
			menu_rotateL.setLabel("Rotate to left");
			menu_rotateL.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {
				
			}});
			
			MenuItem menu_rotateR = new MenuItem();
			menu_rotateR.setLabel("Rotate to right");
			menu_rotateR.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {
				
			}});
			
			MenuItem menu_setWallpaper = new MenuItem();
			menu_setWallpaper.setLabel("Set to wallpaper");
			menu_setWallpaper.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {
				
			}});
			
			MenuItem menu_exit = new MenuItem();
			menu_exit.setLabel("Exit");
			menu_exit.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {
				exitProgram();
			}});

			popupMenu.add(menu_rotateR);
			popupMenu.add(menu_rotateL);
			popupMenu.add(menu_setWallpaper);
			popupMenu.addSeparator();
			popupMenu.add(menu_exit);
			frame.add(popupMenu);
		}
		
		public void keyPressed(KeyEvent keyevent)
		{
			if(inAction)
				return;
			switch(keyevent.getKeyCode())
			{
			case KeyEvent.VK_RIGHT:
				switchImage(true);
				break;
			case KeyEvent.VK_LEFT:
				switchImage(false);
				break;
			case KeyEvent.VK_UP:
				zoomTo((double)CurrImage.viewWidth/(double)CurrImage.getWidth()+ZoomStep);
				break;
			case KeyEvent.VK_DOWN:
				zoomTo((double)CurrImage.viewWidth/(double)CurrImage.getWidth()-ZoomStep);
				break;
			case KeyEvent.VK_ESCAPE:
				exitProgram();
				break;
			}
		}

		public void mousePressed(MouseEvent e)
		{
			if(e.getModifiers()==MouseEvent.BUTTON1_MASK)
				pOnFrame = e.getPoint();
			else if(e.getModifiers()==MouseEvent.BUTTON3_MASK)
				popupMenu.show(frame, e.getX(),e.getY());
		}
		
		public void mouseDragged(MouseEvent e)
		{
			Point pOnScreen = e.getLocationOnScreen();
			frame.setLocation(pOnScreen.x-pOnFrame.x, pOnScreen.y-pOnFrame.y);
		}
		
		public void mouseWheelMoved(MouseWheelEvent e) {
			double cur_scale = (double)CurrImage.viewWidth/(double)CurrImage.getWidth();
			if(e.getWheelRotation()==1)
			{
				zoomTo(cur_scale-ZoomStep);
			}
			else if(e.getWheelRotation()==-1)
			{
				zoomTo(cur_scale+ZoomStep);
			}
		}
		
		public void mouseClicked(MouseEvent e)
		{
			if(e.getClickCount()==2)
				zoomTo(1);
		}

		public void keyReleased(KeyEvent arg0) { }
		public void keyTyped(KeyEvent arg0) { }
		public void mouseEntered(MouseEvent e) { }
		public void mouseExited(MouseEvent e) { }
		public void mouseMoved(MouseEvent e) { }
		public void mouseReleased(MouseEvent e) { }

	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值