`

图片中格式的互转

阅读更多
public class ImageUtil {
	/**
	 * 将图片转换成Base64
	 * @param imgFilePath
	 * @return
	 */
	private double scaleWidth = 358.0;

    private double scaleHeight = 441.0;
    
    private InputStream fis = null;
    
    private BufferedImage bi;
    
    public static String GetImageStr(String imgFilePath) {
         // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
         byte[] data = null;
         // 读取图片字节数组
         try {
             InputStream in = new FileInputStream(imgFilePath);
          data = new byte[in.available()];
          in.read(data);
          in.close();
         } catch (IOException e) {
          e.printStackTrace();
         }
         // 对字节数组Base64编码
         BASE64Encoder encoder = new BASE64Encoder();
         return encoder.encode(data);// 返回Base64编码过的字节数组字符串
        }
    

    /**
     * 本地图片转成InputStream流对象。需要一个参数,base64编码的字符串,可由步骤一得到。
     * @param base64string
     * @return
     */
        public static InputStream BaseToInputStream(String base64string) {
    		ByteArrayInputStream stream = null;
    		try {

    			BASE64Decoder decoder = new BASE64Decoder();

    			byte[] bytes1 = decoder.decodeBuffer(base64string);

    			stream = new ByteArrayInputStream(bytes1);

    		} catch (Exception e) {
    			// TODO: handle exception
    		}
    		return stream;
    	} 
        /**
         * 根据个人编号查询照片,并转换成BASE64。
         * @param base64string
         * @return
         * @throws AppException 
         */
        
        public String queryPhoto(String aac001) throws AppException 
        {
        	InputStream inputStream = null;
            BufferedInputStream bis = null;
            try
            {
                if ("".equals(aac001) || aac001 == null)
                {
                	return "-1$个人编号有误。$$";
                } else
                {
                	HashMap primaryKeys = new HashMap();
            		primaryKeys.put("CC_AC30.CC_AAC001", aac001);
            		String fullColumnName = "CC_AC30.BAC200";	
            		inputStream = SqlUtil.getInstance().executeBlobQuery(fullColumnName, primaryKeys);
                    if (inputStream == null)
                    {
                    	return "-1$系统中没有该人员照片信息!$$";
                    }
                }

            } catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return "-1$查询照片异常。$$";
            } finally
            {
                try
                {
                    if (bis != null)
                        bis.close();
                    if (inputStream != null)
                        inputStream.close();
                } catch (IOException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
            Map map = photoToBase64(inputStream);
            Object picbase64=map.get("picbase64");
            return picbase64.toString();
        }  
        
      //照片转格式
        private Map photoToBase64(InputStream inputStream) throws AppException
        {
            BufferedInputStream bis = null;
            Map map = new HashMap();
            byte[] photo = null;
            String base64Str = null;
            ByteBuffer sb = null;

            //对图片进行base64编码
            try
            {
                sb = ByteBuffer.allocate(inputStream.available());
                int buffersize = 1024;
                photo = new byte[buffersize]; // 缓存
                int bytesRead = 0; // 读取数据临时变量
                bis = new BufferedInputStream(inputStream);

                while ((bytesRead = bis.read(photo, 0, buffersize)) != -1)
                {
                    sb.put(photo, 0, bytesRead);
                }


                // 对字节数组Base64编码, 判断base64码是否超过32k,IE8只能加载32k以下
                BASE64Encoder encoder = new BASE64Encoder();
                base64Str = encoder.encode(sb.array());// 返回Base64编码过的字节数组字符串
                double percent = 1;
                while (base64Str.length() / 1024 > 32)
                {
                    percent = percent - 0.01;
                    base64Str = encoder.encode(sacleImageToBytes(percent));
                    System.out.println("******************************** " + base64Str.length() / 1024 + " kb");
                }
                //
            } catch (IOException e)
            {
                e.printStackTrace();
                throw new AppException("对图片进行base64编码失败!");

            } finally
            {
                try
                {
                    if (bis != null)
                        bis.close();
                    if (inputStream != null)
                        inputStream.close();
                } catch (IOException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            map.put("picbase64", base64Str);
            return map;
        }
        
       
        /**
         * 获取图片的宽度
         * @return
         */
        public int getImgWidth()
        {
            return bi.getWidth();
        }

        /**
         * 获取图片的高度
         * @return
         */
        public int getImgHeight()
        {
            return bi.getHeight();
        }

        /**
         * 获取图片大小
         * @return
         * @throws AppException 
         */
        public double getImgSize() throws AppException
        {
            double size = 0;
            ByteArrayOutputStream baos = null;
            ImageOutputStream ios = null;
            try
            {
                baos = new ByteArrayOutputStream();
                ios = ImageIO.createImageOutputStream(baos);
                write(ios, null, "jpg", bi, null, 0.75f);
            } catch (IOException e)
            {
                throw new AppException("【getImgSize】获取图片大小发生错误:" + e.getMessage());
            } finally
            {
                try
                {
                    if (null != ios)
                    {
                        ios.close();
                    }
                    if (null != baos)
                    {
                        baos.close();
                    }
                } catch (IOException e)
                {
                    throw new AppException("【getImgSize】关闭流发生错误:" + e.getMessage());
                }
            }
            byte[] jpegData = baos.toByteArray();
            size = jpegData.length / 1024.00;
            return size;
        }
        /**
         * 编码输出图像。
         * 向图像文件中添加图像缩略图和设置图像压缩质量需要根据具体图像格式。
         * 
         * @param out 输出流。
         * @param listener 编码输出进度监听器。
         * @param formatName 包含格式非正式名称的 String,例如"jpg"。
         * @param image 图像。
         * @param thumbnails 缩略图集。
         * @param quality 压缩质量。
         * @throws java.io.IOException
         */
        public void write(ImageOutputStream out, IIOWriteProgressListener listener, String formatName,
                BufferedImage image, List thumbnails, float quality) throws IOException
        {
            if (out == null)
            {
                throw new IllegalArgumentException("OutputStream must be non null");
            }

            if (formatName == null)
            {
                throw new IllegalArgumentException("FormatName must be non null");
            }

            if (image == null)
            {
                throw new IllegalArgumentException("Image must be non null");
            }

            // 取得合适的 ImageWriter。
            Iterator writers = ImageIO.getImageWritersByFormatName(formatName);
            if (writers == null || !writers.hasNext())
            {
                throw new IllegalStateException("No " + formatName + " writers!");
            }
            ImageWriter writer = (ImageWriter) writers.next();

            ImageTypeSpecifier imageType = ImageTypeSpecifier.createFromRenderedImage(image);
            IIOMetadata metadata = writer.getDefaultImageMetadata(imageType, null);

            IIOImage iioImage = new IIOImage(image, thumbnails, metadata);

            ImageWriteParam param = writer.getDefaultWriteParam();
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(quality);

            writer.setOutput(out);
            writer.addIIOWriteProgressListener(listener);
            writer.write(null, iioImage, param);
            writer.dispose();
        }
        public byte[] sacleImageToBytes(double percent) throws IOException
        {
        	InputStream in = null;
        	BufferedInputStream bis = null;
    		ByteBuffer sb = null;
        	byte[] photo = null;
        	
        	double _width = this.scaleWidth * percent;
        	double _height = this.scaleHeight * percent;
        	
        	double rate1 = this.scaleWidth  / _width * 1.0;  
        	double rate2 = this.scaleHeight  / _height * 1.0;  
    		// 根据缩放比率大的进行缩放控制  
    		double rate = rate1 > rate2 ? rate1 : rate2;
    		
    		_width = (int)(this.scaleWidth / rate);
    		_height = (int)(this.scaleHeight / rate);
    		
    		try {
    			in = sacleImage(_width, _height, "jpg");
    			
    			sb = ByteBuffer.allocate(in.available());
    			int buffersize = 1024;
    			photo = new byte[buffersize]; // 缓存
    			int bytesRead = 0; // 读取数据临时变量
    			bis = new BufferedInputStream(in);
    			
    			while ((bytesRead = bis.read(photo, 0, buffersize)) != -1) {
    				sb.put(photo, 0, bytesRead);
    			}
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			if(in != null){
    				in.close();
    			}
    			if(bis != null){
    				bis.close();
    			}
    		}
    		
    		return sb.array();
        }
        public InputStream sacleImage(double _width, double _height, String imgType) throws IOException
        {
            double widthRatio = 1.0;
            double heightRatio = 1.0;

            if (this.getImgWidth() != _width)
            {
                widthRatio = _width / this.getImgWidth();
            }
            if (this.getImgHeight() != _height)
            {
                heightRatio = _height / this.getImgHeight();
            }
            byte[] bytes = null;
            if(widthRatio==1.0 && heightRatio==1.0){
            	bytes = InputStreamToByte(this.fis);
            }else{
                Image tempImg = bi.getScaledInstance(new Double(_width).intValue(), new Double(_height).intValue(),
                        BufferedImage.SCALE_SMOOTH);
    	        ByteArrayOutputStream bos = new ByteArrayOutputStream();
    	        AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(widthRatio, heightRatio), null);
    	        tempImg = op.filter(bi, null);
    	        ImageIO.write((BufferedImage) tempImg, imgType, bos);
    	        
    	        bytes = bos.toByteArray();
    	        if (bos != null)
    	        {
    	            bos.close();
    	        }
            }
            return new ByteArrayInputStream(bytes);
        }
        private byte[] InputStreamToByte(InputStream is) throws IOException {
    		ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
    		int ch;
    		while ((ch = is.read()) != -1) {
    			bytestream.write(ch);
    		}
    		byte imgdata[] = bytestream.toByteArray();
    		bytestream.close();
    		return imgdata;
    	} 
        
}

 

分享到:
评论

相关推荐

    java互转jpg和raw格式图片

    本篇文章将详细探讨如何利用Java与JAI-ImageIO库进行JPEG(jpg)与RAW格式图片之间的转换。 首先,让我们了解这两种图像格式。JPEG(Joint Photographic Experts Group)是一种广泛使用的有损压缩图像格式,适用于...

    批量图片转换工具(可批量互转各种图片格式)

    常见的图片格式有JPEG、PNG、BMP、GIF、TIFF等。每种格式都有其特定的用途和特点:JPEG适合存储色彩丰富的照片,但有一定程度的压缩损失;PNG支持透明度,适合网页设计;BMP是无损格式,但文件较大;GIF支持动画,但...

    PNG-ICO图标格式互转工具

    "PNG-ICO图标格式互转工具"是为了满足用户在处理这两种格式之间的转换需求而设计的。这个工具的特点在于其批量转换功能,使得用户能够一次性处理多个文件,大大提高了工作效率。对于设计师或者开发人员来说,这是一...

    PNG-ICO 图标格式互转工具

    该"PNG-ICO图标格式互转工具"是为了方便用户在PNG和ICO格式之间进行转换而设计的。它可能具有以下特性: 1. **简单易用**:根据提供的"readme"文件,用户可以轻松理解如何操作这个工具进行格式转换,无需复杂的图形...

    PDF和图片格式互转工具

    PDF和图片格式互转工具是一种实用的软件,它允许用户方便地在PDF文档与图片格式之间进行转换。这种工具特别适合那些需要频繁处理这两种格式的用户,例如设计师、办公室工作者或者文档管理员。以下是对该工具及其操作...

    VisionMaster算子图像格式互转

    本文将深入探讨如何在VisionMaster中进行图像格式的转换,主要涉及VM格式的CMvdImage与BMP格式之间的互转。 首先,了解两种图像格式的基本特性: 1. BMP(Bitmap)格式:这是最常见的位图格式,它包含了图像的每个...

    图片批量格式转换工具

    1. **多格式支持**:工具应支持主流的图片格式,如JPEG, PNG, BMP, GIF, TIFF等,并能进行灵活的互转。 2. **批量处理**:用户可以一次性选择多个图片文件,进行统一的格式转换操作,大大节省时间。 3. **质量控制...

    PNG格式与ICO格式互转工具

    总的来说,PNG与ICO格式互转工具是图形设计和系统管理员的实用工具,能够方便快捷地处理这两种格式的图像文件,满足不同场景下的需求。通过阅读Readme文件并熟练使用该工具,用户可以提高工作效率,同时增强对图像...

    Webp格式与Bitmap格式(JPG、PNG、Bmp等)互转 C#Demo

    总之,"Webp格式与Bitmap格式(JPG、PNG、Bmp等)互转 C#Demo"是一个实用的工具,可以帮助开发者快速集成WebP支持到他们的.NET应用程序中。通过深入理解这个示例,开发者可以更好地利用WebP的优势,优化他们的图像处理...

    PDF格式文件互转软件

    PDF格式文件互转软件是一种工具,它允许用户将PDF文件转换为其他常见的文档格式,如Microsoft Office系列的Word、Excel和PowerPoint,以及图像格式。转换后的文件可以方便地进行编辑、修改,以适应各种行业的需求。...

    图片文件格式转换工具1.2

    《图片文件格式转换工具1.2》是一款专为用户解决图片格式互转问题而设计的实用软件。在日常生活中,我们可能需要将图片文件在不同的格式之间进行转换,以满足不同场景的需求,如网页设计、打印输出或者社交媒体分享...

    易语言字节集与图片互转

    在易语言编程环境中,字节集与图片的互转是一个常见的操作,特别是在处理网络数据传输、文件存储或图像处理时。下面将详细解释这个过程,以及如何使用易语言实现这一功能。 字节集(Byte Array)是编程中用来存储二...

    JPG与PNG图片格式互转批处理

    JPG与PNG图片格式互转批处理

    ICO和PNG图标相互转换生成软件,支持PNG格式和ICO格式的图标相互转换

    总的来说,"PNG和ICO转来转去"软件是一个实用的工具,它简化了两种图标格式之间的转换流程,对于那些频繁在不同格式间切换的用户来说,无疑是一个宝贵的资源。无论是为了适应不同平台的需求,还是为了优化图标设计,...

    UMD TXT互转 电子书格式互转

    关于UMD和TXT格式的互转,这主要涉及到文件解析和编码的转换。在描述中提到的"TXT小说易.exe"应该是一款专门用于此目的的转换工具。该软件能够读取UMD文件中的文本内容,并将其导出为TXT格式,同时也可以将TXT文件...

    halcon图片Qt图片互转

    halcon彩色图片转化成Qt彩色图片,或者Qt彩色图片转化为halcon彩色图片,也就是HObject QImage的互转,希望有帮助

    适用于批量多图片格式互转的小工具

    自主研发制作的一款图片格式互转小工具,支持常见的8种图片格式psd、jpg、jpeg、bmp、xmp、ico、svg和webp等文件的相互转换,共50多种转换方式: 1.psd转jpg、jpeg、bmp、xmp、ico、svg、webp 2.jpg转psd、jpeg、bmp...

    Get清风eps-emf-jpg格式相互转换方法.pdf

    同时,讨论了图片格式互转换时的注意事项和解决方案。 一、图片格式的特点 * jpg格式:压缩率高,文件体积小,但图片质量下降。 * png格式:支持透明特性,广泛应用于网络和图标。 * emf格式:矢量格式,放大不...

    PDF转换器文档图片互转软件

    将图片转换为PDF格式,可以方便用户整理和分享多张图片,同时也提供了更好的隐私保护,因为PDF文件可以设置密码。 其次,该软件还支持将PDF文件转换为其他多种格式,包括但不限于Word(DOC、DOCX)、纯文本(TXT)...

    c++图片与base64互转

    在本案例中,我们关注的是如何在C++环境下使用OpenCV库进行图片与Base64字符串之间的相互转换。OpenCV是一个强大的计算机视觉库,除了图像处理功能外,它也可以用来读取和写入图像文件。 首先,我们需要理解Base64...

Global site tag (gtag.js) - Google Analytics