`
jiasanshou
  • 浏览: 17271 次
  • 性别: 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处理上传后的图片

    ### Java处理上传后的图片知识点详解 #### 一、图片上传及处理概述 在现代Web应用中,用户上传图片的功能十分常见。为了优化用户体验并减轻服务器存储压力,通常会在图片上传后进行一系列处理,如压缩、缩放等。...

    java 图像上传裁剪

    总的来说,"java 图像上传裁剪"涉及前端JavaScript的图像选择和裁剪交互,以及后端Java的图像处理。前端利用jQuery插件实现用户友好的裁剪界面,而后端通过解析前端传递的数据,使用Java图像处理库进行实际的裁剪...

    Java实现图片上传

    这些可以通过在服务器端设置过滤规则或使用图像处理库(如ImageMagick或Java的Java Advanced Imaging API)来实现。 在处理完图片后,我们还需要返回一个响应给客户端,告知上传是否成功。这通常是一个JSON格式的...

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

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

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

    在Java开发中,处理图像尤其是来自...以上就是使用Java处理iPhone拍照上传时的图片旋转和压缩问题的方法。在实际应用中,可能还需要考虑其他因素,如图片尺寸调整、色彩管理等,但这个工具类已经能解决大部分基本需求。

    java 上传图片生成缩略图

    本文介绍了使用Java实现上传图片并生成缩略图的方法,包括获取文件路径、读取图像、创建缩略图及保存缩略图等步骤。通过这种方式,可以在不损失原图质量的前提下,有效地减少加载时间,提升用户体验。此外,本文还...

    java处理图片上传旋转问题,前台后台讲解特别明了。

    Java作为后端语言,处理这种情况时需要与前端协同工作,确保用户上传的图片能正确显示。本文将详细阐述如何在前后台解决图片旋转问题。 ### 前端处理 前端处理主要涉及到图片预览和上传前的旋转操作。当用户通过...

    java图片上传、控制大小、宽度高度和图片裁剪并保存

    这些功能在Web应用、图像处理软件或者数据分析项目中都有广泛的应用。下面我们将深入探讨如何使用Java实现这些功能。 1. **图片上传** 在Java Web开发中,图片上传通常涉及到客户端通过HTTP协议将图片文件发送到...

    java 图片上传,可预览可剪切可缩放

    - **后端缩放**:在服务器端,可以使用Java的图像处理库,如`ImageIO`或`JavaFX`,根据指定尺寸重新调整图片大小。 5. **Java实现** - **Servlet处理**:Java Web应用通常使用Servlet来接收上传的文件,解析`...

    java实现上传图片存入到数据库

    在Java编程中,将图片上传并存储到数据库是一项常见的任务,尤其在开发Web应用时。这一过程涉及到文件处理、数据库操作以及可能的图像处理。以下是对这个主题的详细阐述: 首先,我们需要理解基本的文件上传流程。...

    java 图片旋转、翻转、镜像处理

    虽然JAI提供了更强大的图像处理功能,但Java 2D API通常更易于理解和使用,尤其对于简单的图像操作如旋转、翻转和镜像。 1. **图片旋转**: - 使用Java 2D API中的`AffineTransform`类可以实现图片的旋转。首先...

    Java语言&&图像处理

    这个程序可能是为了教学目的,帮助初学者理解Java编程以及图像处理的基本概念,也可能用于解决实际的大作业问题。 Java提供了丰富的库来支持图像处理,其中最常用的是Java Advanced Imaging (JAI) API和Java 2D API...

    java 上传图片配置

    以上就是关于"java上传图片配置"的主要知识点,涵盖了从后端接收图片、处理图片到存储图片的全过程,以及涉及到的JavaMagick和ImageMagick工具的使用。在实际开发中,根据项目需求和团队技术栈,可以选择不同的实现...

    毕业论文设计-IT计算机-java图形图象处理(论文+系统).zip

    这篇毕业论文设计主要聚焦在IT计算机领域,使用Java语言进行图形图像处理的实践与研究。在Java编程环境中,图形图像处理是一项重要的应用技术,广泛应用于各种软件开发,如图像编辑工具、游戏开发、数据可视化等领域...

    java上传大图片

    在Java编程中,上传大图片是一项常见的任务,特别...总之,Java上传大图片涉及的不仅仅是简单的文件上传,还包括了多方面的技术整合,如文件处理、并发控制、服务器配置、安全策略等,需要开发者具备全面的技能和经验。

    java实现图片的上传以及根据需要缩小显示

    以上就是使用Java实现图片上传并按需缩放显示的基本步骤。实际应用中,还需要考虑错误处理、内存管理、文件安全、性能优化等方面的问题。提供的文档"图片上传显示(缩小图片).doc"应该包含了更详细的代码示例和具体...

    java实现图片上传并添加水印效果(文字水印,蒙版,logo图片),自动进行文字大小行数位置匹配 ,文字自动换行

    在Java编程中,实现图片上传并添加水印效果是一项常见的任务,这通常涉及到图像处理、图形用户界面(GUI)和文件I/O等多个方面。在这个项目中,我们将关注以下几个关键知识点: 1. **Java图像处理库**:Java标准库...

    上传图片实例 JAVA

    在Java编程语言中,上传图片是一项常见的功能,特别是在开发Web应用程序时,如社交网络、博客系统或电商网站等。这个“上传图片实例JAVA”的主题主要涵盖了如何在Java环境中实现图片的上传、处理和存储。下面将详细...

    java批量上传图片并生成缩略图

    总之,实现"java批量上传图片并生成缩略图"的功能,需要结合Java的Servlet技术处理文件上传,使用图像处理库生成缩略图,并且在前后端之间进行有效的通信。这不仅是技术上的挑战,也是对系统设计和优化能力的考验。

Global site tag (gtag.js) - Google Analytics