java 图像IO (二)

来源:互联网 发布:淘宝导航条怎么改颜色 编辑:程序博客网 时间:2024/06/05 20:42

 /*****************************************************
  * 旋转图片
  *
  * @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;
 }

原创粉丝点击