Java实现的图像查看器完整实例

本文实例讲述了Java实现的图像查看器。分享给大家供大家参考。具体如下:

1. MyCanvas.java:

package PictureViewer;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
public class MyCanvas extends Canvas implements ComponentListener{
  private BufferedImage bi;
  private Image im;
  private int image_width;
  private int image_height;
  public void setImage(BufferedImage bi){
    this.bi = bi;
    this.zoom();
  }
  public void paint(Graphics g){
    g.drawImage(im,(this.getWidth()-image_width)/2,(this.getHeight()-image_height)/2,this);
  }
  public void componentResized(ComponentEvent e){
    if(bi != null){
      System.out.println("resize!!");
      this.zoom();
      this.repaint();
    }
  }
  public void componentMoved(ComponentEvent e){}
  public void componentShown(ComponentEvent e){}
  public void componentHidden(ComponentEvent e){}
  public void zoom(){
    if(bi == null)
      return;
    int screen_width = this.getWidth();
    int screen_height = this.getHeight();
    double screen_proportion = 1.0 * screen_height / screen_width;
    System.out.println("screen: w "+screen_width+" ,h "+screen_height+" ,p0 "+screen_proportion);
    image_width = bi.getWidth(this);
    image_height = bi.getHeight(this);
    double image_proportion = 1.0 * image_height / image_width;
    System.out.println("image: w "+image_width+" ,h "+image_height+" ,p1 "+image_proportion);
    if(image_proportion > screen_proportion){
      image_height = screen_height;
      image_width = (int)(image_height / image_proportion);
      System.out.println(" p1>p0 w= "+image_width);
    }else{
      image_width = screen_width;
      image_height = (int)(image_width * image_proportion);
      System.out.println(" p0>p1 h= "+image_height);
    }
    im = bi.getScaledInstance(image_width,image_height,Image.SCALE_SMOOTH);
  }
}

2. MyFilter.java:

package PictureViewer;
import java.io.File;
import java.io.FilenameFilter;
public class MyFilter implements FilenameFilter{
  private String[] extension;
  public MyFilter(){
    extension = new String[]{".jpg", ".JPG", ".gif", ".GIF", ".png", ".PNG", ".jpeg", ".JPEG"};
  }
  public MyFilter(String[] extension){
    this.extension = extension;
  }
  public boolean accept(File dir,String name){
    for(String s : extension){
      if(name.endsWith(s)){
        return true;
      }
    }
    return false;
  }
}

3. PictureViewer.java:

package PictureViewer;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
public class PictureViewer implements ActionListener{
  private Frame frame;
  private MyCanvas mc ;
  private String fpath;
  private String fname;
  private File[] files;
  private int findex ;
  private FileDialog fd_load;
  private MyFilter filter;
  private Button previous ;
  private Button next ;
  public static void main( String args[]) throws Exception {
    new PictureViewer().init();
  }
  public void init(){
    frame = new Frame("PictureViewer");
    Panel pb = new Panel();
    Button select = new Button("选择图片");
    previous = new Button("上一张");
    next = new Button("下一张");
    select.addActionListener(this);
    previous.addActionListener(this);
    next.addActionListener(this);
    pb.add(select);
    pb.add(previous);
    pb.add(next);
    mc = new MyCanvas();
    mc.setBackground(new Color(200,210,230));
    mc.addComponentListener(mc);
    frame.add(pb,"North");
    frame.add(mc,"Center");
    frame.setSize(360,360);
    frame.setLocation(400,200);
    frame.addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent e){
        System.exit(0);
      }
    });
    frame.setVisible(true);
    this.validateButton();
    filter = new MyFilter();
    fd_load = new FileDialog(frame,"打开文件",FileDialog.LOAD);
    fd_load.setFilenameFilter(filter);
  }
  public void actionPerformed(ActionEvent e){
    String command = e.getActionCommand();
    if(command.equals("选择图片")){
      fd_load.setVisible(true);
      fpath = fd_load.getDirectory();
      fname = fd_load.getFile();
      if((fpath != null) && (fname != null)){
        this.display(new File(fpath + fname));
        files = new File(fpath).listFiles(filter);
        this.setIndex();
      }
    }else if(command.equals("上一张")){
      findex--;
      if(findex<0)
        findex = 0;
      this.display(files[findex]);
    }else if(command.equals("下一张")){
      findex++;
      if(findex >= files.length)
        findex = files.length-1;
      this.display(files[findex]);
    }
    this.validateButton();
  }
  public void display(File f){
    try{
      BufferedImage bi = ImageIO.read(f);
      mc.setImage(bi);
      frame.setTitle("PictureViewer - [" + f.getName() + "]");
    }catch(Exception e){
      e.printStackTrace();
    }
    mc.repaint();
  }
  public void setIndex(){
    File current = new File(fpath + fname);
    if(files != null){
      for(int i=0;i<files.length;i++){
        if(current.equals(files[i])){
          findex = i;
        }
      }
    }
  }
  public void validateButton(){
    previous.setEnabled((files!=null) && (findex > 0));
    next.setEnabled((files!=null) && (findex<(files.length-1)));
  }
}

希望本文所述对大家的java程序设计有所帮助。

(0)

相关推荐

  • Java应用程序中创建图像

    合成图像 您不必从文件中读取所有的图像 - 您可以创建自己的图像.要创建自己的图像,最灵活的方法是用一个 BufferedImage 对象,它是 Image 类的一个子类,它把图像数据存储在一个可以被访问的缓冲区中.它还支持各种存储像素数据的方法:使用或不使用 alpha 通道.不同种类的颜色模型以及颜色组件的各种精确度.ColorModel 类提供一种灵活的方法定义各种颜色模型,以和 BufferedImage 对象一起使用.为了理解颜色模型工作的基本知识,我们将只使用一个缺省的颜色模型,其颜

  • 举例解析Java的图像缓冲技术的使用

    当图像信息量较大,采用以上直接显示的方法,可能前面一部分显示后,显示后面一部分时,由于后面一部分还未从文件读出,使显示呈斑驳现象.为了提高显示效果,许多应用程序都采用图像缓冲技术,即先把图像完整装入内存,在缓冲区中绘制图像或图形,然后将缓冲区中绘制好的图像或图形一次性输出在屏幕上.缓冲技术不仅可以解决闪烁问题,并且由于在计算机内存中创建图像,程序可以对图像进行像素级处理,完成复杂的图像变换后再显示. [例]小应用程序程序演示图像缓冲显示技术.程序运行时,当鼠标在图像区域内按下时,图像会出现边框,

  • 详解Java如何实现图像灰度化

    24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB.通常,许多24位彩色图像存储为32位图像,每个像素多余的字节存储为一个alpha值,表现有特殊影响的信息[1]. 在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值.亮度值),灰度范围为0-255[2].这样就得到一幅图片的灰度图. 几种灰度化的方法 1.分量法:使用RGB三个分量中

  • Java图像处理教程之正片叠底效果的实现

    前言 本文主要给大家介绍了关于利用Java如何实现正片叠底效果的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 正片叠底,在Photoshop中是一种混合模式,简单的说就是可以让2个图层的内容融合起来. PS中最佳展示用例 融合的计算公式其实非常简单,就是 A*B/255.(A.B是指的图层A和图层B) 再解释一下就是: A图层中的红色通道和B图层中的红色通道所对应的每一个像素的灰阶值相乘,再被255除.得到一个新的红色通道. 蓝色与绿色通道的操作也是一样的. 实现方法

  • Java图像处理工具类

    本工具类的功能:缩放图像.切割图像.图像类型转换.彩色转黑白.文字水印.图片水印等 复制代码 代码如下: package net.kitbox.util; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Re

  • 简述Java图像倾斜方法及实例 原创

    可以使用 graphics2D 类提供的 shear() 方法设置绘图的倾斜方向,从而使图像实现倾斜的效果.下面,我们一起来看一下它的使用方法和实例. 语法如下: shear(double shx,double shy) shx:水平方向的倾斜量: shy:垂直方向的倾斜量.    实例:在窗体上绘制图像,使图像在水平方向实现倾斜效果.下面是具体代码: public class TiltImage extends JFrame{ private Image img; private MyCanv

  • 使用Java进行图像处理的一些基础操作

    图像是由一组像素构成,用二进制形式保存的图片.java语言支持GIF.JPEG和BMP这3种主要图像文件格式.java语言的图像处理功能被封装在Image类中. 图像载入和输出 在java程序中,图像也是对象,所以载入图像时,先要声明Image对象,然后,利用getImage()方法把Image对象与图像文件联系起来.载入图像文件的方法有两个: Image getImage(URL url),url指明图像所在位置和文件名. Image getImage(URL url,String name)

  • java数字图像处理基础使用imageio写图像文件示例

    一个BufferedImage的像素数据储存在Raster中,ColorModel里面储存颜色空间,类型等信息,当前Java只支持一下三种图像格式- JPG,PNG,GIF,如何向让Java支持其它格式,首先要 完成Java中的图像读写接口,然后打成jar,加上启动参数- Xbootclasspath/pnewimageformatIO.jar即可. Java中如何读写一个图像文件,使用ImageIO对象即可.读图像文件的代码如下: 复制代码 代码如下: File file = new File

  • Java图像之自定义角度旋转(实例)

    图像的旋转需要调用 Graphics2D 类的rotate()方法,该方法将根据指定的弧度旋转图像. 语法如下: rotate(double theta) 其中, theta 是指旋转的弧度. 说明:该方法只接受旋转的弧度作为参数,可以使用 Math 类的 toRadians()方法将角度转换为弧度. toRadians()方法接受角度值作为参数,返回值是转换完毕的弧度值. 实例代码: /** *//** * 旋转图片为指定角度 * * @param bufferedimage * 目标图像 *

  • Java实现的图像查看器完整实例

    本文实例讲述了Java实现的图像查看器.分享给大家供大家参考.具体如下: 1. MyCanvas.java: package PictureViewer; import java.awt.*; import java.awt.event.*; import java.awt.image.*; public class MyCanvas extends Canvas implements ComponentListener{ private BufferedImage bi; private Im

  • Handler制作简单相册查看器的实例代码

    Handler类简介 在Android平台中,新启动的线程是无法访问Activity里的Widget的,当然也不能将运行状态外送出来,这就需要有Handler机制进行信息的传递了,Handler类位于android.os包下,主要的功能是完成Activity的Widget与应用程序中线程之间的交互. 开发带有Handler类的程序步骤如下: 1. 在Activity或Activity的Widget中开发Handler类的对象,并重写handlerMessage方法. 2. 在新启动的线程中调用s

  • java语言实现权重随机算法完整实例

    前言 现在app就是雨后春笋,嗖嗖的往外冒啊,有经验的.没经验的.有资历的.没资历的都想着创业,创业的90%以上都要做一个app出来,好像成了创业的标配. 做了app就得推广啊,怎么推,发券送钱是最多用的被不可少的了,现在好多产品或者运营都要求能够随机出优惠券的金额,但是呢又不能过于随机,送出去的券都是钱吗,投资人的钱,是吧. 所以,在随机生成的金额中就要求,小额度的几率要大,大额度的几率要小,比如说3元的70%,5块的25%,10块的5%,这个样子的概率去生成优惠券,这个怎么办呢? 对于上述的

  • Java编程实现多线程TCP服务器完整实例

    相关Java类 Socket public class Socket extends Object ·功能:TCP客户端套接字 ·构造方法: Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号 ·常用方法: 1.getInetAddress 获得InetAddress的相关信息 2.getInputStream 获得此TCP连接的输入流 3.getOutPutStream 获得此TCP连接的输出流 ServerSo

  • JS实现的RGB网页颜色在线取色器完整实例

    本文实例讲述了JS实现的RGB网页颜色在线取色器.分享给大家供大家参考,具体如下: 运行效果图如下: 完整实例代码如下: <html> <head> <meta content="text/html; charset=utf-8" http-equiv="content-type"> <meta name="description" content="在线取色器"> <me

  • Java实现的日期处理类完整实例

    本文实例讲述了Java实现的日期处理类.分享给大家供大家参考,具体如下: 开发中常常要使用日期,先小结如下,以备后用. import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class FormatTime { private final static SimpleDateFormat sdf=new

  • Java实现的汉语拼音工具类完整实例

    本文实例讲述了Java实现的汉语拼音工具类.分享给大家供大家参考,具体如下: package test; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.piny

  • Java swing实现的计算器功能完整实例

    本文实例讲述了Java swing实现的计算器功能.分享给大家供大家参考,具体如下: package awtDemo; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Vector; public class Calculator { String str1 = "0"; // 运算数1 初值一定为0 为了程序的安全 String str2 = "0"

  • Java实现的zip工具类完整实例

    本文实例讲述了Java实现的zip工具类.分享给大家供大家参考,具体如下: 实现把zip解压到指定路径,把文件夹压缩到zip,把文件列表压缩为zip的三个方法 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

  • Java实现九九乘法表的完整实例(对齐版)

    Java实现九九乘法表 思路: 1.看到九九乘法表就可以想到for循环,1-9可以写成一个for循环,自增1 2.那就是双重for循环,第一个for循环用于生成1-9的数值 3.第二个for循环的终止条件让其小于等于第一个for循环的值 4.最后输出一行之后换行,避免堆积在一起! 贴出代码: public class MultiplicationTable { /** * Java实现九九乘法表 * */ public static void main(String[] args) { for

随机推荐