Java如何实现图片裁剪预览功能

yizhihongxing

下面是Java实现图片裁剪预览功能的完整攻略。

简介

图片裁剪和预览功能是很多网站或APP必备的功能之一,其中预览功能可以帮助用户选择需要裁剪的具体区域,增加用户的交互体验。而图片裁剪是在预览的基础上对图片进行裁剪,并最终将裁剪后的图片保存到数据库或文件系统中。

Java如何实现图片裁剪预览功能?下面我们将通过两个示例分别介绍基于Java的后端技术和前端技术实现图片裁剪预览功能的方案。

示例1:基于Java的后端技术

准备工作

前置技术:Spring Boot、Spring MVC、Thymeleaf模板引擎、Bootstrap前端框架、alibaba的fastjson

  1. 创建Spring Boot项目,并导入依赖项。
<!-- Spring Boot Web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Thymeleaf -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- Bootstrap -->
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>bootstrap</artifactId>
    <version>3.3.7</version>
</dependency>
<!-- fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>
  1. 创建上传文件和裁剪信息实体类。
public class UploadFile {
    private MultipartFile file;
    // getters and setters
}

public class CropInfo {
    private String imgSrc;
    private String imgData;
    private String imgX;
    private String imgY;
    private String imgWidth;
    private String imgHeight;
    // getters and setters
}

实现流程

  1. 定义前端页面

在Thymeleaf模板引擎中,我们可以使用Bootstrap的modal组件实现一个简单的图片裁剪预览功能。具体的HTML代码可以参考以下示例(为了简化代码,省略了样式和其他不相关的HTML标签)。

<div class="modal fade" id="cropModal" tabindex="-1" role="dialog"
    aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-body">
                <img id="crop-img" crossorigin="anonymous"/>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default"
                    data-dismiss="modal">取消</button>
                <button type="button" class="btn btn-primary"
                    onclick="submitCropInfo()">确认</button>
            </div>
        </div>
    </div>
</div>

<form method="post" enctype="multipart/form-data" action="#" th:action="@{/crop}">
    <div class="form-group">
        <input type="file" name="file" onchange="previewImage()" />
    </div>
    <div class="form-group">
        <input type="text" id="img-data" name="uploadInfo.imgData"
            class="form-control" />
    </div>
    <div class="form-group">
        <input type="text" id="img-x" name="cropInfo.imgX"
            class="form-control" />
    </div>
    <div class="form-group">
        <input type="text" id="img-y" name="cropInfo.imgY"
            class="form-control" />
    </div>
    <div class="form-group">
        <input type="text" id="img-w" name="cropInfo.imgWidth"
            class="form-control" />
    </div>
    <div class="form-group">
        <input type="text" id="img-h" name="cropInfo.imgHeight"
            class="form-control" />
    </div>
    <div class="form-group">
        <button type="button" class="btn btn-info"
            onclick="$('#cropModal').modal('show')">查看图片</button>
    </div>
    <div class="form-group">
        <button type="submit" class="btn btn-primary">提交</button>
    </div>
</form>
  1. 实现预览和裁剪功能

在前端代码中,我们需要使用HTML5的FileReader对象来预览上传的图片,并使用canvas标签和JavaScript来完成图片的裁剪。

// 预览图片,同时绑定裁剪事件
function previewImage() {
    var file = document.querySelector('input[type=file]').files[0];
    var reader = new FileReader();
    reader.onload = function (event) {
        var img = document.getElementById("crop-img");
        img.classList.remove("cropper-hidden");
        img.src = event.target.result;
    };
    reader.readAsDataURL(file);
}

// 提交裁剪信息
function submitCropInfo() {
    var canvasData = $('#crop-img').cropper('getData');
    $('#img-data').val(canvasData['imageData']);
    $('#img-x').val(canvasData['x']);
    $('#img-y').val(canvasData['y']);
    $('#img-w').val(canvasData['width']);
    $('#img-h').val(canvasData['height']);
    $('#cropModal').modal('hide');
}
  1. 后端接收数据并裁剪图片

后端代码中,我们需要使用JavaFileBufferedImage、以及ImageIO等相关API对上传的图片进行裁剪,并将裁剪后的图片存储到指定位置。

@PostMapping("/crop")
public String cropImage(@RequestParam("file") MultipartFile file,
                        @ModelAttribute(value="uploadInfo") UploadFile uploadInfo,
                        @ModelAttribute(value="cropInfo") CropInfo cropInfo) {
    try {
        // Get the file and save it somewhere
        byte[] bytes = file.getBytes();
        Path path = Paths.get(UPLOAD_FOLDER + file.getOriginalFilename());
        Files.write(path, bytes);

        BufferedImage image = ImageIO.read(path.toFile());

        // 构造裁剪区域
        int width = Integer.parseInt(cropInfo.getImgWidth().split("\\.")[0]);
        int height = Integer.parseInt(cropInfo.getImgHeight().split("\\.")[0]);
        int x = Integer.parseInt(cropInfo.getImgX().split("\\.")[0]);
        int y = Integer.parseInt(cropInfo.getImgY().split("\\.")[0]);
        Rectangle rect = new Rectangle(x, y, width, height);

        // 裁剪图片
        BufferedImage croppedImage = image.getSubimage(x, y, width, height);

        // 保存裁剪后的图片
        File outputfile = new File("cropped.jpg");
        ImageIO.write(croppedImage, "jpg", outputfile);

        return "redirect:/success.html";
    } catch (IOException e) {
        e.printStackTrace();
        return "redirect:/error.html";
    }
}

示例2:基于前端技术

准备工作

前置技术:jQuery、cropper.js

  1. 在HTML中引用相关的JavaScript和CSS文件。
<link rel="stylesheet"
    href="https://cdnjs.cloudflare.com/ajax/libs/cropper/3.1.6/cropper.min.css" />
<script
    src="https://cdnjs.cloudflare.com/ajax/libs/cropper/3.1.6/cropper.min.js"></script>

实现流程

  1. 准备前端页面

在前端代码中,我们需要使用选用上传的图片并使用cropper.js实现图片裁剪预览功能。

<div class="row">
    <div class="col-md-6">
        <div>
            <img id="image" src="https://via.placeholder.com/360x360"
                alt="Picture">
        </div>
        <br>
        <input type="file" id="inputImage" accept="image/*">
    </div>
    <div class="col-md-6">
        <div>
            <img id="preview" alt="Preview"
                style="max-width: 100%;">
        </div>
    </div>
</div>

<div class="row">
    <div class="col-md-12">
        <div class="btn-group">
            <button class="btn btn-primary" data-method="reset"
                title="Reset">
                <span class="docs-tooltip" data-toggle="tooltip"
                    title="$().cropper(&quot;reset&quot;)">调整大小</span>
            </button>

            <button class="btn btn-primary" data-method="rotate"
                data-option="-45" title="Rotate Left">
                <span class="docs-tooltip" data-toggle="tooltip"
                    title="$().cropper(&quot;rotate&quot;, -45)">逆时针旋转</span>
            </button>
            <button class="btn btn-primary" data-method="rotate"
                data-option="45" title="Rotate Right">
                <span class="docs-tooltip" data-toggle="tooltip"
                    title="$().cropper(&quot;rotate&quot;, 45)">顺时针旋转</span>
            </button>
            <button class="btn btn-primary" data-method="zoom"
                data-option="0.1" title="Zoom In">
                <span class="docs-tooltip" data-toggle="tooltip"
                    title="$().cropper(&quot;zoom&quot;, 0.1)">放大</span>
            </button>
            <button class="btn btn-primary" data-method="zoom"
                data-option="-0.1" title="Zoom Out">
                <span class="docs-tooltip" data-toggle="tooltip"
                    title="$().cropper(&quot;zoom&quot;, -0.1)">缩小</span>
            </button>
        </div>
    </div>
</div>
  1. 使用JavaScript实现裁剪和预览功能

在前端JavaScript代码中,我们需要使用jQuery获取DOM元素并初始化cropper.js。然后通过cropper.js提供的相关API实现图片的裁剪和预览功能。

var $image = $('#image');
var $inputImage = $('#inputImage');

$(function () {
    $inputImage.change(function () {
        var files = this.files;
        var file;

        if (!$image.data('cropper')) {
            return;
        }

        if (files && files.length) {
            file = files[0];

            if (/^image\/\w+$/.test(file.type)) {
                blobURL = URL.createObjectURL(file);
                $image.one('built.cropper', function () {
                    URL.revokeObjectURL(blobURL);
                }).cropper({
                    preview: '#preview',
                    aspectRatio: 16 / 9
                });
                $inputImage.val('');
            } else {
                window.alert('Please choose an image file.');
            }
        }
    });

    // Export preview
    $('#getDataURL').on('click', function () {
        $('#dataURLModal').modal('show').find('.modal-body').html('<img src="' + $image.cropper('getCroppedCanvas').toDataURL('image/jpeg') + '">');
    });

    // Methods
    $('.docs-buttons').on('click', '[data-method]', function () {
        var $this = $(this);
        var data = $this.data();
        $image.cropper(data.method, data.option);
    });
});

以上就是基于前端技术(JavaScript)实现图片裁剪预览功能的流程。

总结

本文从两个不同的角度介绍了Java如何实现图片裁剪预览的功能,分别是基于Java后端技术和基于前端技术。通过这两个示例,希望能够为读者提供灵活且适合自己场景的方案。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java如何实现图片裁剪预览功能 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • java 之JNA中的Memory和Pointer的使用方法

    Java中JNA中的Memory和Pointer的使用方法 什么是JNA? JNA是Java Native Access的简称,它是一个Java库,用于调用Native代码。它通过使用Java的动态代理机制调用Native代码,支持Windows,Linux和Mac等操作系统,且完全无需编写任何C/C++代码。 为什么需要使用JNA? 在Java中无法直接调…

    Java 2023年5月26日
    00
  • Spring Cloud Feign 使用对象参数的操作

    下面我会详细讲解“Spring Cloud Feign 使用对象参数的操作”的完整攻略,包括如何定义Feign客户端接口,如何使用对象参数进行远程调用等。 1. 定义Feign客户端接口 首先,我们需要定义一个Feign客户端接口。在这个接口中,我们可以定义多条请求方法,用于进行远程调用。在使用对象参数时,我们需要使用 @RequestBody 注解来修饰参…

    Java 2023年5月20日
    00
  • 浅谈JSP与Servlet传值及对比(总结)

    浅谈JSP与Servlet传值及对比(总结)是一篇比较详细介绍 JSP 和 Servlet 之间数据传递的文章。在该文章中,作者讲述了JSP和Servlet传值的几种方式以及它们在不同情况下的使用情况。 1. JSP与Servlet JSP和Servlet是相互联系的,JSP可以添加Java代码,Servlet可以生成HTML代码。JSP和Servlet重点…

    Java 2023年6月15日
    00
  • SpringBoot使用Filter实现签名认证鉴权的示例代码

    下面我将为您详细讲解如何使用SpringBoot的Filter实现签名认证与鉴权。 一、认证与鉴权 认证是指验证一个用户的身份是否合法,常见的认证方式包括用户名密码、社交账号、手机短信验证等。而鉴权则是指在对用户进行操作时,判断其是否有权限进行该操作。例如,管理员有权修改用户数据,而普通用户则没有这个权限。 二、SpringBoot中使用Filter进行认证…

    Java 2023年5月20日
    00
  • java io文件操作删除文件或文件夹的7种方法

    请看下面的详细讲解: Java IO文件操作删除文件或文件夹的7种方法 在Java程序中,有时候需要删除文件或文件夹。Java IO提供了多种删除文件或文件夹的方法,下面将介绍其中的7种方法。 1. 使用File.delete()方法删除单个文件 我们可以使用File类的delete()方法删除单个文件。delete()方法返回一个bool值,表示删除操作是…

    Java 2023年5月26日
    00
  • JAVA.io读写文件方式汇总

    Java.io读写文件方式汇总 在Java编程中,经常需要对文件进行读写操作,这时候就需要使用Java IO类库中提供的读写文件的方法。本文将会综合常用的文件读写方式,详细介绍其用法和适用场景。 1. FileInputStream/FileOutputStream FileInputStream和FileOutputStream是用来读写二进制文件的基本工…

    Java 2023年5月20日
    00
  • 详解在Spring MVC中使用注解的方式校验RequestParams

    在Spring MVC中使用注解的方式校验RequestParams 在Spring MVC中,我们可以使用注解的方式来校验请求参数,这样可以避免在控制器中编写大量的校验代码。本文将详细介绍在Spring MVC中使用注解的方式校验RequestParams,并提供两个示例说明。 校验注解 在Spring MVC中,我们可以使用以下注解来校验请求参数: @N…

    Java 2023年5月17日
    00
  • Java IO流 File类的常用API实例

    Java IO流 File类的常用API实例攻略 1. 什么是Java IO流 File类? Java IO流是Java核心API中的一部分,它提供了一种在Java应用程序中进行输入和输出操作的方式。File类是Java IO流中的重要类,它用于封装文件或目录的访问操作,提供了一系列对于文件或目录进行操作的方法。 2. File类的常用方法 2.1 File…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部