`
jiasanshou
  • 浏览: 15988 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JAVA上传图像时图像处理的基本方法

阅读更多

 

一,form表单类型

<form id="xxForm" action="xx.htm" method="post" enctype ="multipart/form-data" >

则请求头含有:

formdata-----------------------------14471729621574Content-Disposition: form-data; name="Filedata"; filename="11.jpg"Content-Type: image/jpeg

二,文件大小控制(3M)

MultipartFile file = ((MultipartHttpServletRequest) request).getFile("Filedata");

if (file == null || file.getSize() >= 3 * 1024 * 1024) {

    showErrorMsg();

}



三,文件后缀名控制

直接使用MultipartFile file 的getOriginalFilename()方法,获取到的中文名称可能是乱码。建议单独传参fileName

String suffix = StringUtil.substringAfterLast(fileName, ".").toLowerCase();
        if (!suffix.matches(IMAGE_TYPE)) {

           showErrorMsg();

       }

private static final String                       IMAGE_TYPE             = "(jpg|jpeg|png)";



四,文件安全检查

以上三种类型都应该可以正常转换为jpg文件

try {
            src = ImageIO.read(infile.getInputStream());
        } catch (IOException e) {
            throw e;
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

ImageIO.write(src, "jpg", baos);



五,图片裁剪,缩放

 

/**
     * 裁剪图片
     *
     * @param in
     * @param out
     * @param format (jpg,jpeg,png)
     * @param x 截取后的x坐标
     * @param y 截取后的y坐标
     * @param width 截取后的宽度
     * @param height 截取后的高度
     * @param orgWidth 图片宽度
     * @param orgHeight 图片高度
     */
    public static void clipPic(ByteArrayInputStream in, ByteArrayOutputStream out, String format,
                               int x, int y, int width, int height, int orgWidth, int orgHeight) {
        try {
            LoggerUtil.info(LOGGER, "[PicCompress]开始裁减图片! ");

            BufferedImage tag = ImageIO.read(in);
            BufferedImage oute = null;
            int sourceWidth = tag.getWidth();
            int sourceHeight = tag.getHeight();
            if (width >= orgWidth && height >= orgHeight) {
                oute = tag.getSubimage(0, 0, sourceWidth, sourceHeight);
            } else {
                double rateW = (double) sourceWidth / (double) orgWidth;
                double rateH = (double) sourceHeight / (double) orgHeight;
                int targetWidth = (int) ((width < orgWidth ? width : orgWidth) * rateW);
                int targetHeight = (int) ((height < orgHeight ? height : orgHeight) * rateH);
                int targetX = (int) (x * rateW);
                int targetY = (int) (y * rateH);
                oute = tag.getSubimage(targetX, targetY, targetWidth, targetHeight);
            }
            //保存新图片  
            ImageIO.write(oute, format, out);
        } catch (IOException e) {
            LoggerUtil.warn(LOGGER, "[PicCompress]裁减图片失败! ", e);
        }
    }

 

六,图片压缩

 

public static void compressPic(ByteArrayInputStream in, ByteArrayOutputStream out,
                                   String format, int size, int limitSize) {

        try {
            BufferedImage img = ImageIO.read(in);
            double rate = (double) limitSize / (double) size;
            int width = (int) (img.getWidth() * rate);
            int height = (int) (img.getHeight() * rate);
            BufferedImage tag = null;
            if (StringUtil.equals(format, "png")) {
                tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            } else {
                tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            }

            tag.getGraphics().drawImage(img.getScaledInstance(width, height, Image.SCALE_SMOOTH),
                0, 0, null);

            //保存新图片  
            ImageIO.write(tag, format, out);
        } catch (IOException e) {
            LoggerUtil.warn(LOGGER, "[PicCompress]压缩图片大小失败! ", e);
        }
    }

七,其他流处理工具

 

转换

 

/**
     * 从输入流读取内容, 写入到输出流中.  使用指定大小的缓冲区.
     *
     * @param in 输入流
     * @param out 输出流
     * @param bufferSize 缓冲区大小(字节数)
     *
     * @throws IOException 输入输出异常
     */
    public static void io(InputStream in, OutputStream out, int bufferSize)
            throws IOException {
        if (bufferSize == -1) {
            bufferSize = DEFAULT_BUFFER_SIZE;
        }

        byte[] buffer = new byte[bufferSize];
        int    amount;

        while ((amount = in.read(buffer)) >= 0) {
            out.write(buffer, 0, amount);
        }
    }
private static final int DEFAULT_BUFFER_SIZE = 8192;

 

关闭,应当在finally中执行

 

/**
     * 安全的关闭流
     * @param <T>
     * @param stream
     */
    public static <T extends Closeable> void closeStreamSafely(T stream) {
        if (stream == null) {
            return;
        }
        try {
            stream.close();
        } catch (IOException e) {
            //ignore
        }
    }

 

同步化的输出流

 

/**
     * 同步化的输出流包裹器.
     */
    private static class SynchronizedOutputStream extends OutputStream {
        private OutputStream out;
        private Object       lock;

        SynchronizedOutputStream(OutputStream out) {
            this(out, out);
        }

        SynchronizedOutputStream(OutputStream out, Object lock) {
            this.out      = out;
            this.lock     = lock;
        }

        public void write(int datum) throws IOException {
            synchronized (lock) {
                out.write(datum);
            }
        }

        public void write(byte[] data) throws IOException {
            synchronized (lock) {
                out.write(data);
            }
        }

        public void write(byte[] data, int offset, int length)
                throws IOException {
            synchronized (lock) {
                out.write(data, offset, length);
            }
        }

        public void flush() throws IOException {
            synchronized (lock) {
                out.flush();
            }
        }

        public void close() throws IOException {
            synchronized (lock) {
                out.close();
            }
        }
    }



 

 

 

 

 



分享到:
评论

相关推荐

    基于Java与MATLAB的数字图像处理网络平台构建.pdf

    本文针对数字图像处理教学实验难度大这一问题,采用MATLAB与Java语言混合编程的方法实现数字图像处理网络实验平台。该方法利用MATLAB软件编写可以实现图像处理的m函数,该函数通过MCR编译器打包之后可以导入Java编写的...

    java 图片压缩 iphone拍照上传旋转问题处理压缩工具类

    java 图片压缩 iphone拍照上传旋转问题处理,压缩工具类 首先导入jar 包,通过imgxz获取图片是否旋转属性,在调用旋转方法,旋转过来,然后在进行压缩

    JAVA图像特征提取代码

    基于ImageJ的一个java图像处理插件 有完整的界面(尚未完善好) 暂时包含的是灰度特征的提取,包含像素个数,灰度直方图 正在完善形状和纹理特征,敬请期待!

    js+jquery+java实现的头像上传和裁剪

    js+jquery+java实现的头像上传和裁剪,界面仿百度头像上传样式,完美兼容各种浏览器,集成java上传技术+java图像处理+js剪切图片效果+jquery无刷新上传文件

    java图片、文件处理

    java图片、文件处理,提供图片截切,图片压缩,上传,等

    java源码包---java 源码 大量 实例

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    JAVA将文本转图片

    将程序中文字生成为图片,根据文字行数、每行文字个数自动设置生成图片的大小。生成图片后如需水印可查看我上传的其他资源进行处理。

    在Eclipse平台使用Java开发的处理图像代码

    在Eclipse平台使用Java开发的处理图像的软件,包括放缩、去噪、均值化等操作。

    java源码包4

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 ...

    微软Azure OCR图像识别Java代码

    利用微软的计算机视觉API识别图像中的中文文字,上传方式有URL和文件上传两种处理,包括分析后文字内容的解析。

    java源码包3

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 ...

    基于qt和opencv的数字图像处理大作业+源代码+文档说明

    用途:数字图像处理大作业(简易) 实现功能: 放大缩小 平移 旋转 对称 错切 1、资源内容:基于qt和opencv的数字图像处理大作业+源代码+文档说明 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便...

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    JAVA上百实例源码以及开源项目

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    java源码包2

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 ...

    java+jq+jcrop缩放裁剪上传图片

    在js中压缩,在页面上选定区域并上传,在java中根据参数处理图像,页面处理图片缩放裁剪上传的功能。

    java开源包5

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    机器学习学习资源-基于opencv和python的智能图像处理源码集合.zip

    机器学习学习资源-基于opencv和python的智能图像处理源码集合.zip机器学习学习资源-基于opencv和python的智能图像处理源码集合.zip机器学习学习资源-基于opencv和python的智能图像处理源码集合.zip机器学习学习资源-...

    微信小程序:小程序上传用户图像至服务器,服务器处理后,小程序下载图片并保存到本地。

    微信小程序:小程序上传用户图像至服务器,服务器处理后,小程序下载图片并保存到本地。

Global site tag (gtag.js) - Google Analytics