您的位置:首页 > 编程语言 > Java开发

java 图像IO (二)

2014-04-01 19:38 155 查看
 /*****************************************************

  * 旋转图片

  * 

  * @param buffimg

  * @param radians

  * @return file

  ****************************************************/

 public static File rotateImage(String filename, int angle) {

  File file = new File(filename);

  BufferedImage buffimg = null;

  try {

   buffimg = ImageIO.read(file);

  } catch (IOException e) {

   e.printStackTrace();

  }

  int w = buffimg.getWidth();

  int h = buffimg.getHeight();

  //目标图片

  BufferedImage tempimg = null;

  Graphics2D graphics2d = null;

  int type = buffimg.getColorModel().getTransparency();

  if(angle%360==0){

   return file;

  }else if(angle%180==0){

   //图片形状不变

   tempimg = new BufferedImage(w, h, type);

   graphics2d = tempimg.createGraphics();

   //Math.toRadians(angle), w / 2, h / 2, 三参数中,前者为角度,后两者为原图片左上角移动后的对齐点

   graphics2d.rotate(Math.toRadians(angle), w / 2, h / 2);

  }

  else if(angle % 90 ==0) {

   //图片形状变了

   tempimg = new BufferedImage(h, w, type);

   graphics2d = tempimg.createGraphics();

   //使之顺时针为-,逆时针为+

   angle=-angle;

   //Math.toRadians(angle),x,y, 前者为角度,后两者为原图片 移动后的对齐点

   if(angle<0)//顺时针旋转-90(h/2,h/2)

    graphics2d.rotate(Math.toRadians(angle), w/ 2, w / 2);

   else//逆时针旋转+90(w/2,w/2)

    graphics2d.rotate(Math.toRadians(angle), h / 2, h / 2);

  }

  else{

   System.out.println("Can't handle this angel! ");

   return file;

  }

  //把buffimg写到目标图片中去

  graphics2d.drawImage(buffimg, 0, 0, null);

  graphics2d.dispose();

  buffimg = tempimg; // 让用于显示的缓冲区图像指向过滤后的图像

  try {

   ImageIO.write(buffimg, getsuffix(filename), file);

  } catch (IOException e) {

   e.printStackTrace();

  }

  buffimg.flush();

  return file;

 }

/*****************************************************************

*简单转化(不改变图像的像素深度和压缩方式)

***************************************************************/

public class ImageIOTest { 

    public static void main(String args[]) throws IOException { 

        File inputFile = new File("c://11.jpg");        

        BufferedImage input = ImageIO.read(inputFile); 

        

        File outputFile = new File("c://test.jpg"); 

        ImageIO.write(input, "JPG", outputFile); 

        

        outputFile = new File("c://test.png"); 

        ImageIO.write(input, "PNG", outputFile); 

  } 

}

其中支持的文件格式有

import javax.imageio.*;

import java.util.Arrays;

public class GetFormats {

    public static void main(String args[]) {

    

        System.out.println("MIMETypes:")

        String readFormats[] = ImageIO.getReaderMIMETypes();

        String writeFormats[] =ImageIO.getWriterMIMETypes();

        System.out.println("Readers: " + Arrays.asList(readFormats));

        System.out.println("Writers: " + Arrays.asList(writeFormats));

        System.out.println();

        

        System.out.println("FileSuffixes:")

        String readFormats[] = ImageIO.getReaderFileSuffixes();

        String writeFormats[] = ImageIO.getWriterFileSuffixes();

        System.out.println("Readers: " + Arrays.asList(readFormats));

        System.out.println("Writers: " + Arrays.asList(writeFormats));

        System.out.println();

        

        System.out.println("FormatNames:")

        String readFormats[] = ImageIO.getReaderFormatNames();

        String writeFormats[] = ImageIO.getWriterFormatNames();

        System.out.println("Readers: " + Arrays.asList(readFormats));

        System.out.println("Writers: " + Arrays.asList(writeFormats));

    }

}

MIMETypes:

Readers: [image/png, image/jpeg, image/x-png, image/vnd.wap.wbmp, image/bmp, image/gif]

Writers: [image/jpeg, image/png, image/x-png, image/vnd.wap.wbmp, image/gif, image/bmp]

FileSuffixes:

Readers: [bmp, jpg, wbmp, jpeg, png, gif]

Writers: [bmp, jpg, jpeg, wbmp, png, gif]

FormatNames:

Readers: [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]

Writers: [BMP, bmp, jpg, JPG, jpeg, wbmp, png, JPEG, PNG, WBMP, GIF, gif]

 /********************************************************************

  * 翻转图像

  * 

  * @param buffimg

  * @param flag

  * @return file

  *******************************************************************/

 public static File reverseImage(String filename, int flag) {

  File file = new File(filename);

  BufferedImage buffimg = null;

  try {

   buffimg = ImageIO.read(file);

  } catch (IOException e) {

   e.printStackTrace();

  }

  int w = buffimg.getWidth();

  int h = buffimg.getHeight();

  // 水平翻转图像

  if (flag == HORIZIONALREVERSAL) {

   // 利用几何移动类操作,坐标更换实现翻转

   AffineTransform transform = new AffineTransform(-1, 0, 0, 1, w, 0);

   AffineTransformOp op = new AffineTransformOp(transform, null);

   BufferedImage tempimg = op.filter(buffimg, null);

   buffimg = tempimg;

  } else

  // 垂直翻转图像

  if (flag == VERTICALREVERSAL) {

   AffineTransform transform = new AffineTransform(1, 0, 0, -1, 0, h);

   AffineTransformOp op = new AffineTransformOp(transform, null);

   BufferedImage tempimg = op.filter(buffimg, null);

   buffimg = tempimg;

  } else

   System.out.println("param err!");

  // 写回源文件

  try {

   ImageIO.write(buffimg, getsuffix(filename), file);

  } catch (IOException e) {

   e.printStackTrace();

  }

  buffimg.flush();

  return file;

 }

 /**********************

  * 剪切图片

  * 

  * @param bufimg

  * @param startx

  * @param starty

  * @param endx

  * @param endy

  * @return

  *********************/

 public static BufferedImage cutpic(BufferedImage bufimg, int startx,

   int starty, int endx, int endy) {

  bufimg = bufimg.getSubimage(startx, starty, endx, endy);

  return bufimg;

 }

 

 /********************************

  * 缩放图片

  * 

  * @param buffimg

  * @param width

  * @param height

  * @param hints

  * @return

  ************************/

 public static BufferedImage scanPic(BufferedImage buffimg, int width,

   int height) {

  Image image = buffimg.getScaledInstance(width, height,

    Image.SCALE_DEFAULT);

  // BufferedImage与Image转换

  BufferedImage temp = new BufferedImage(width, height, buffimg.getType());

  Graphics g = temp.getGraphics();

  g.drawImage(image, 0, 0, null);

  g.dispose();

  buffimg = temp;

  return buffimg;

 }

 /******************

  * 反色显示图像 

  * 

  * @param file

  * @return

  *****************/

 public static BufferedImage invertcolor(BufferedImage buffimg) {

  WritableRaster wr = null;

  int[] bitmap = null;

  //修改图片

  wr = buffimg.getRaster();

  bitmap=wr.getPixels(0, 0, wr.getWidth(), wr.getHeight(), (int[]) null);

  //反色

  if (bitmap != null) {

   //System.out.println("not null");//调试语句

   for (int i = 0; i < bitmap.length; i++)

    bitmap[i] = ~bitmap[i];

   wr.setPixels(0, 0, wr.getWidth(), wr.getHeight(), bitmap);

  }

  //写回图片

  buffimg=new BufferedImage(buffimg.getColorModel(),wr,false,null);

  return buffimg;

 }

 /**************************

  * 判断是否是bmp单色图

  * 

  * @param buffimg

  * @return

  ************************/

 public static boolean isbmp2pic(BufferedImage buffimg) {

  boolean yes = false;

  final int fhofferset = 0;// 文件头偏移位置

  final int infofferser = 14;// 信息头偏移位置

  byte[] databyte = null;

  // BufferedImage 转为byte[]

  ByteArrayOutputStream out = new ByteArrayOutputStream();

  try {

   ImageIO.write(buffimg, "bmp", out);

  } catch (IOException e) {

   e.printStackTrace();

  }

  databyte = out.toByteArray();

  // 获取图形格式标志位

  String formflag = "" + (char) databyte[0 + fhofferset]

    + (char) databyte[1 + fhofferset];

  // 获取每个像数的位数,该数据在信息头

  int pixsize = ((databyte[15 + infofferser] & 0xff) << 8)

    | databyte[14 + infofferser] & 0xff;

  // System.out.println("The bits per pixe is:"+pixsize);//调试语句

  // 判断是否是bmp单色图

  if (formflag.equals("BM") && pixsize == 1)

   yes = true;

  return yes;

 }

 

     /** 

     * 彩色转为黑白,深度不变

     * @param source

     * @param result

     */

    public static void gray(String source, String result)

    {

        try

        {

            BufferedImage src = ImageIO.read(new File(source));

            ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);

            ColorConvertOp op = new ColorConvertOp(cs, null);

            src = op.filter(src, null);

            ImageIO.write(src, "JPEG", new File(result));

        }

        catch (IOException e)

        {

            e.printStackTrace();

        }

    }

 /******************************

  * 转换为bmp2色黑白图片

  * 

  * @param filename

  * @return file

  */

 public static RenderedImage convert2bmp(String filename) {

  File file = new File(filename);

  BufferedImage colimg = null;

  try {

   colimg = ImageIO.read(file);

  } catch (IOException e) {

   e.printStackTrace();

  }

  //首先将彩色图片转化为灰度图片

  ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);

  ColorConvertOp op = new ColorConvertOp(cs, null);

  BufferedImage grayimg = op.filter(colimg, null);

  //转为单色1bit图片

  Histogram histogram =(Histogram)JAI.create("histogram", grayimg).getProperty("histogram");

  double[] threshold = histogram.getPTileThreshold(0.4); //改变域值可以得到不同效果

  //RenderedImage bwimg =

  // JAI.create("binarize", grayimg, new Double(threshold[0]));//还可以使用Dithere替换binarize

  RenderedImage bwimg =

   JAI.create("dithere", grayimg, new Double(threshold[0]));

  grayimg.flush();

  //写回文件   

  try {

   ImageIO.write(bwimg, "bmp", file);

  } catch (IOException e) {

   e.printStackTrace();

  }

  file.renameTo(new File(getprefix(filename)+".bmp"));

  return bwimg;

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图像处理