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) { }
}
}
ImageViewer
最新推荐文章于 2024-09-03 09:10:23 发布