vue 图片分辨率等比例缩放上传

需求:上传图片之前按比例缩小图片分辨率,宽高不超过1920不处理图片,宽高超过1920则缩小图片分辨率,如果是一张图片请参考这篇博客:js实现图片压缩、分辨率等比例缩放
我根据这篇博主的分享,写下了我的循环上传的分辨率等比缩小
功能:点击+号,新增一项,点击- 号 删除一项
在这里插入图片描述
:auto-upload="false" 使用elementUI组件不能使他自动上传,主要功能是上传最左边的图片

 <el-form ref="form" :model="form"  label-width="120px">
 	<el-form-item label="资源列表:">
       <div class="ziyuan" flex v-for="(item, indexes) in  addList " :key="item.idxxx">
           <div style="margin-top: 9px;">
           //图片(主要功能在这里)
               <el-upload :action="domins + '/common/upload'"
                   :class="{ disabled: item.uploadDisabled }" list-type="picture-card"
                   
                   :auto-upload="false"
                   :on-remove="handleRemove.bind(null, { 'index': indexes, 'data': item })"
                  
                   :on-change="handleChange.bind(null, { 'index': indexes, 'data': item })"
                   :file-list="item.fileList" accept="image/png, image/jpeg">
                   <i class="el-icon-plus"></i>
               </el-upload>
               <el-dialog :visible.sync="dialogVisible">
                   <img width="100%" :src="item.dialogImageUrl" alt="">
               </el-dialog>

           </div>
           <div class="yasuo" flex="cross:center">
               <div>
                   <div style="height: 68px;">
                   //压缩包
                       <el-upload ref="uploadzip" :action="domins + '/common/upload'"
                           :before-upload="beforeUploadZip" :on-remove="handleRemoveZip"
                           :on-success="handleAvatarSuccessZip.bind(null, { 'index': indexes, 'data': item })"
                           :file-list="item.fileListZip" :auto-upload="true" accept=".zip ,.mp4"
                           :limit="1">
                           <el-button size="small" type="primary">选择资源包</el-button>
                       </el-upload>
                   </div>
               </div>
           </div>
           <div class="airadio">
               <el-radio-group v-model="item.way" >
                   <el-radio :label="0">Android</el-radio>
                   <el-radio :label="1">ios</el-radio>
                   <el-radio :label="2">视频</el-radio>
               </el-radio-group>
           </div>
           <div style="margin-top: 11px;">
           //  '+'
               <i class="el-icon-circle-plus-outline" style="color: #264E71;"
                   @click="plusOne(indexes)"></i>
                     //  '+'
               <i class="el-icon-remove-outline" style="color: #264E71;" v-show="addList.length > 1"
                 @click="removeOne(indexes, item.id, item)"></i>

           </div>
       </div>
   </el-form-item>
 </el-form>

代码:

<script>
// 等比例缩小图片
function imageScale(width, originWidth, originHeight) {
    const scaleRatio = width / originWidth;
    const scaleHeight = scaleRatio * originHeight;
    return [width, scaleHeight];
}

export default {
    components: {  },
    data() {
        return {
       	 	form: {},
       	 	addList: [{
                id: 0,
                uploadDisabled: false,
                album: '',
                zip: '',
                way: 0,
                idxxx: 0
            }],
        }
    },
    methods:{
    	handleRemove(obj, file, fileList) {
            let index = obj.index;

            this.addList[index].uploadDisabled = false
            this.$forceUpdate()
        },
        // 处理图片
        compress(file, scaleWidth, quality = 0.5) {
            return new Promise((resolve, reject) => {
                const reader = new FileReader();
                console.log(file, 'file----');
                reader.readAsDataURL(file.raw);
                reader.onload = (e) => {
                    let img = new Image();
                    img.src = e.target.result;
                    img.onload = function () {
                        // 等比例缩放图片
                        const [width, height] = imageScale(
                            scaleWidth,
                            img.width,
                            img.height
                        );
                        let canvas = document.createElement("canvas");
                        img.width = canvas.width = width;
                        img.height = canvas.height = height;
                        let ctx = canvas.getContext("2d");
                        ctx.drawImage(img, 0, 0, img.width, img.height);
                        canvas.toBlob(
                            (blob) => {
                                resolve(blob);
                            },
                            "image/jpeg",
                            quality
                        );
                    };

                    img.onerror = function () {
                        reject();
                    };
                };
            });
        },
        handleChange(obj, file, fileList) {
            console.log(file, fileList, 'file, fileList识别图路径');
            if (fileList.length >= 1) {
                let reader = new FileReader()
                reader.readAsDataURL(file.raw) // 必须用file.raw
                reader.onload = () => {
                
                    let img = new Image()
                    img.src = reader.result

                    img.onload = () => {
                        console.log(img.width, 'img.width');
                        console.log(img.height, 'img.height');
                        // 宽高超过1920则缩小图片分辨率
                        if (img.width > 1920 || img.width == 1920 || img.height > 1920 || img.height == 1920) {
                            this.compress(file, 1024).then((blob) => {
                            // 根据后端的要求传数据,如果要求是blob,则不需要处理数据,我这边需求是上传file文件流
                            //处理成file文件流 

                                let f = new File([blob], 'image.jpg', { type: 'image/jpeg' })
                                var form = {};
                                form = new FormData();
                                form.append('file', f);
                                this.$axios.post(this.domins + '/common/upload', form).then((res) => {

                                    let index = obj.index;

                                    this.addList[index].uploadDisabled = true
                                    this.addList[index].album = res.data.data.fullurl
                                    console.log(this.addList, '==addList==');
                                })
                            });
                        } else {
							//宽高不超过1920不处理图片
                            let form = {};
                            form = new FormData();
                            // form 需要的是el-upload 中的file.row
                            form.append('file', file.raw);

                            this.$axios.post(this.domins + '/common/upload', form).then((res) => {
                                let index = obj.index;
                                this.addList[index].uploadDisabled = true
                                this.addList[index].album = res.data.data.fullurl
                                console.log(this.addList, '==addList=3333=');
                            })
                        }
                    }
                }

            }


        },
    }
}
</script>

在这里插入图片描述

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用CSS的transform属性来实现根据分辨率比例缩放。 首先获取屏幕分辨率,可以使用Electron的screen模块: ```javascript const { screen } = require('electron'); const { width, height } = screen.getPrimaryDisplay().workAreaSize; ``` 然后根据分辨率计算缩放比例: ```javascript const scale = Math.min(width / 1920, height / 1080); ``` 这里假设设计稿的分辨率为1920x1080,可以根据实际情况进行调整。 最后将缩放比例应用到页面上: ```css body { transform: scale(${scale}); transform-origin: top left; } ``` 这里使用了模板字符串来动态设置缩放比例,transform-origin属性用来设置缩放的起点,默认为中心点,这里设置为左上角。 完整代码示例: ```javascript const { app, BrowserWindow, screen } = require('electron'); let mainWindow = null; function createWindow() { const { width, height } = screen.getPrimaryDisplay().workAreaSize; const scale = Math.min(width / 1920, height / 1080); mainWindow = new BrowserWindow({ width: 1920, height: 1080, webPreferences: { nodeIntegration: true } }); mainWindow.loadFile('index.html'); mainWindow.webContents.on('did-finish-load', () => { mainWindow.webContents.insertCSS(` body { transform: scale(${scale}); transform-origin: top left; } `); }); } app.whenReady().then(() => { createWindow(); }); ``` 注意,这里使用了webContents的did-finish-load事件来确保页面加载完成后再应用样式,避免出现闪烁或错位的情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值