将url获取的图片转换成base64,并判断图片是否旋转

项目中遇到从服务器获取的图片发生了逆时针90度的旋转,现在要将其正常显示,想到的办法是:

1.先将url对应的图片转成base64

2.再判断base64图片有怎样的旋转偏差,并进行对应的矫正

代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>nick getBase64</title>
</head>
<body>
<div><img id="test" src="" alt="" class="img1"/></div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="../js/exif.js"></script>
<script>

    //将从服务器获取的图片转换成base64
    var getBase64ByUrl = function(src, callback, outputFormat) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', src, true);

        xhr.responseType = 'arraybuffer';

        xhr.onload = function(e) {
            if (xhr.status == 200) {
                var uInt8Array = new Uint8Array(xhr.response);
                var i = uInt8Array.length;
                var binaryString = new Array(i);
                while (i--) {
                    binaryString[i] = String.fromCharCode(uInt8Array[i]);
                }
                var data = binaryString.join('');
                var base64 = window.btoa(data);
                var dataUrl = "data:" + (outputFormat || "image/png") + ";base64," + base64;
                callback.call(this, dataUrl);
            }
        };

        xhr.send();
    }


    getBase64ByUrl("网址", function(url) {
        var image = new Image();
        image.src = url;
        image.onload = function() {
            EXIF.getData(image, function() {
                //判断图片是否旋转
                orient = EXIF.getTag(this, 'Orientation');
                    if(orient==1){
                        rotateBase64Img(url, 180,1, callback)
                    }
            });
        };
    });

    function rotateBase64Img(src, edg,i, callback) {
        var canvas = document.createElement("canvas");
        var ctx = canvas.getContext("2d");
        var imgW;//图片宽度
        var imgH;//图片高度
        var size;//canvas初始大小
        if (edg % 90 != 0) {
            console.error("旋转角度必须是90的倍数!");
            throw '旋转角度必须是90的倍数!';
        }
        (edg < 0) && (edg = (edg % 360) + 360)
        const quadrant = (edg / 90) % 4; //旋转象限
        const cutCoor = {sx: 0, sy: 0, ex: 0, ey: 0}; //裁剪坐标
        var image = new Image();
        image.crossOrigin = "anonymous"
        image.src = src;
        image.onload = function () {
            imgW = image.width;
            imgH = image.height;
            size = imgW > imgH ? imgW : imgH;
            canvas.width = size * 2;
            canvas.height = size * 2;
            switch (quadrant) {
                case 0:
                    cutCoor.sx = size;
                    cutCoor.sy = size;
                    cutCoor.ex = size + imgW;
                    cutCoor.ey = size + imgH;
                    break;
                case 1:
                    cutCoor.sx = size - imgH;
                    cutCoor.sy = size;
                    cutCoor.ex = size;
                    cutCoor.ey = size + imgW;
                    break;
                case 2:
                    cutCoor.sx = size - imgW;
                    cutCoor.sy = size - imgH;
                    cutCoor.ex = size;
                    cutCoor.ey = size;
                    break;
                case 3:
                    cutCoor.sx = size;
                    cutCoor.sy = size - imgW;
                    cutCoor.ex = size + imgH;
                    cutCoor.ey = size + imgW;
                    break;
            }
            ctx.translate(size, size);
            ctx.rotate(edg * Math.PI / 180);
            ctx.drawImage(image, 0, 0);
            var imgData = ctx.getImageData(cutCoor.sx, cutCoor.sy, cutCoor.ex, cutCoor.ey);
            if (quadrant % 2 == 0) {
                canvas.width = imgW;
                canvas.height = imgH;
            } else {
                canvas.width = imgH;
                canvas.height = imgW;
            }
            ctx.putImageData(imgData, 0, 0);
            callback(i,canvas.toDataURL())
        };
    }

    function callback(i,base64data) {
        $('.img'+i).attr('src', base64data);

    }
</script>
</body>
</html>

url网址最好是通过域名访问的,因为我需要遍历,所以加了参数i,不需要的可以去掉。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java代码示例,可以将一个文件夹所有的图片转换成base64格式,并将结果保存到Excel: ```java import java.io.*; import java.util.Base64; import org.apache.poi.ss.usermodel.*; public class ImageToBase64Excel { public static void main(String[] args) { String folderPath = "C:/images"; // 图片所在文件夹路径 String excelPath = "C:/images.xlsx"; // 保存Excel文件路径 // 创建Excel工作簿 Workbook workbook = WorkbookFactory.create(new File(excelPath)); Sheet sheet = workbook.createSheet("Images"); int rowNum = 0; // 遍历文件夹的所有图片文件 File folder = new File(folderPath); File[] files = folder.listFiles(); for (File file : files) { if (file.isFile() && file.getName().toLowerCase().endsWith(".jpg")) { // 读取图片文件并转换成base64格式 byte[] imageBytes = readBytesFromFile(file); String base64String = Base64.getEncoder().encodeToString(imageBytes); // 保存base64格式到Excel Row row = sheet.createRow(rowNum++); row.createCell(0).setCellValue(file.getName()); row.createCell(1).setCellValue(base64String); } } // 保存Excel文件 try (FileOutputStream outputStream = new FileOutputStream(excelPath)) { workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } } // 读取文件字节流 private static byte[] readBytesFromFile(File file) { try (FileInputStream inputStream = new FileInputStream(file)) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } return outputStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); return null; } } } ``` 该代码使用了Apache POI库来创建和操作Excel文件。在遍历文件夹的所有图片文件时,只处理以“.jpg”为后缀的文件。对于每个图片文件,先读取其字节流,再将其转换成base64格式。最后,将文件名和base64格式保存到Excel文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值