react antd 实现图片自定义预览

antdv upload+image 实现上传组件中预览为多文件预览功能 ant design update预览可以多张图片预览,能上下切换 阅读详情

功能需求

有这样一个需求,用户点击文字或者按钮,会弹出图片的预览界面,要求图片可旋转,可缩放以及可下载。由于antd组件的Image的预览窗口不包含图片下载的功能,所以这里通过modal对img添加预览模块。

实现过程

代码如下:

import React from 'react';
import './style.css';
import { Button, Modal } from 'antd';
import {
  ZoomInOutlined,
  ZoomOutOutlined,
  UndoOutlined,
  RedoOutlined,
  DownloadOutlined,
} from '@ant-design/icons';

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      imgSrc:
        'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
      imageVisible: false,
      imgScale: '100%',
      imgTransform: '',
      imgCurrent: 0,
    };
  }

  closeImagePreviewModel = () => {
    this.setState({
      imageVisible: false,
      imgScale: '100%',
      imgTransform: '',
      imgCurrent: 0,
    });
  };
  //放大
  imgToBigger = () => {
    let a = parseInt(this.state.imgScale) + 5 + '%';
    this.setState({ imgScale: a });
  };
  //缩小
  imgToSmaller = () => {
    let a = parseInt(this.state.imgScale) + -5 + '%';
    this.setState({ imgScale: a });
  };
  //左旋转
  imgToLeftRoll = () => {
    let a = (this.state.imgCurrent - 90) % 360;
    this.setState({ imgTransform: 'rotate(' + a + 'deg)', imgCurrent: a });
  };
  //右旋转
  imgToRightRoll = () => {
    let a = (this.state.imgCurrent + 90) % 360;
    this.setState({ imgTransform: 'rotate(' + a + 'deg)', imgCurrent: a });
  };
  // 下载
  downloadImage = () => {
    const imgUrl = this.state.imgSrc;
    const xhr = new XMLHttpRequest();
    let url = imgUrl;
    xhr.responseType = 'blob';
    xhr.onload = function () {
      if (this.status == '200') {
        let blob = this.response;
        let a = document.createElement('a');
        a.style = 'display:none';
        const reader = new FileReader();
        reader.readAsDataURL(blob);
        reader.onload = function (e) {
          a.download = 'test.jpg';
          a.href = e.target.result;
          document.body.append(a);
          a.click();
          a.remove();
        };
      }
    };
    xhr.open('get', url, true);
    xhr.send();
  };

  render = () => {
    const { imgScale, imgSrc, imgTransform, imageVisible } = this.state;
    return (
      <div>
        <Button
          onClick={() => {
            this.setState({ imageVisible: true });
          }}
        >
          预览图片
        </Button>
        <Modal
          title="图片预览"
          visible={imageVisible}
          onCancel={this.closeImagePreviewModel}
          style={{
            top: 0,
            maxWidth: '100vw',
            paddingBottom: 0,
          }}
          bodyStyle={{
            textAlign: 'center',
            height: 'calc(100vh - 118px)',
            overflowY: 'auto',
          }}
          width="100vw"
          footer={[
            <div style={{ margin: '0 auto', textAlign: 'center' }}>
              <Button
                style={{ border: 'none', padding: '5px 8px' }}
                title="放大"
                onClick={() => this.imgToBigger()}
              >
                <ZoomInOutlined />
              </Button>
              <Button
                style={{ border: 'none', padding: '5px 8px' }}
                title="缩小"
                onClick={() => this.imgToSmaller()}
              >
                <ZoomOutOutlined />
              </Button>
              <Button
                style={{ border: 'none', padding: '5px 8px' }}
                title="逆时针旋转"
                onClick={() => this.imgToLeftRoll()}
              >
                <UndoOutlined />
              </Button>
              <Button
                style={{ border: 'none', padding: '5px 8px' }}
                title="顺时针旋转"
                onClick={() => this.imgToRightRoll()}
              >
                <RedoOutlined />
              </Button>
              <Button
                style={{ border: 'none', padding: '5px 8px' }}
                title="下载"
                onClick={() => this.downloadImage()}
              >
                <DownloadOutlined />
              </Button>
            </div>,
          ]}
        >
          <img
            src={imgSrc}
            style={{
              width: 'auto',
              height: 'auto',
              maxWidth: '100vw',
              maxHeight: 'calc(100vh - 158px)',
              position: 'relative',
              margin: '0 auto',
              scale: imgScale,
              transform: imgTransform,
            }}
          />
        </Modal>
      </div>
    );
  };
}

实现效果

React antd 自定义图片预览实现

Ant-design 源码分析之数据展示(十)Image Ant-design 源码分析之数据展示(十)Image 2021SC@SDUSC 一、组件结构 1、ant代码结构 2、组件结构 ant中Image的index.tsx中引入了PreviewGroup。 二、antd组件调用关系 1、index.tsx 导入相应模块以及相应的ICON图标 import * as React from 'react'; import { useContext } from 'react'; import EyeOutlined from '@ant-design/icon 阅读详情

相关推荐

基于React+antd的后台管理模板(可预览)

自己利用业余时间,基于React+antd写了一个后台管理模板。主要是熟悉antd组件和React,页面主要还是展示页面,不涉及后台交互。 特点: 我用

张致豪 9万+

Ant Design 实现图片上传及预览

前端使用Ant design vue,后端使用spring-boot 实现图片批量上传及预览功能

wyf1048713166的博客 5828

基于React + Antd + Java的OFD文件上传预览实现方案(OFD文件转图片)

完整实现需要根据实际业务需求调整参数,例如图片分辨率(ImageMaker的dpi参数)、返回格式等。通过ofd文件转图片后,可满足基本OFD预览需求。可以参考这位老哥的解决方案,通过 ofd 转成 pdf 之后进行预览。但我感觉这样麻烦一点,还要处理 pdf 预览的问题。直接转图片预览最直接。

z284747的博客 1170

【antd】图片预览组件

1 组件官方 官网:https://zmage.caldis.me/ github:https://github.com/Caldis/react-zmage 2 安装 npm i react-zmage --save 3 参数(具体参看github) 配置项 类型 默认值 描述 示例 src String "" 图片 Url,与 img...

idwtwt的专栏 1万+

React实现多图片预览功能、预览图上下张切换(实战示例)

在React项目中,展示和预览多张图片是一种常见的需求。本篇帖子将介绍如何使用React和antd库来实现这一功能,并探讨如何在预览模态框中切换到前一张或后一张图片。本篇帖子介绍了如何使用React和antd库实现多图片预览功能,并在预览模态框中实现了切换到前一张或后一张图片的拓展功能。通过对状态的管理和处理用户点击事件,我们可以轻松地实现这一功能。希望本篇文章能帮助你理解和应用多图片预览的技术实现方法。

Da_zhenzai的博客 2569

pc端react预览图片的两款插件,react-images, react-images-viewer

在pc端预览图片还是常见的业务,但是吧 antd中好像没有直接预览图片的插件, 但是你可以通过 Modal 和 Carousel 两个插件配合起来封装一个。 当然你也可以直接找一个预览图片的插件 这里就推荐两个插件。 react-images 和。react-images-viewer react-images 1. 安装 yarn add react-images --save or npm/cnpm i react-images --save 2. 在代码中使用 可以直接封装成一个组件 方便以后

业余前端的职业经历 4902

【react + antd】antd如何自定义请求使用antd的upload组件实现图片上传且可预览可删除

要使用upload,特别重要的属性就是fileList文件列表,我们通过控制fileList的内容来显示清空图片列表。需要额外的事件才触发图片上传到服务器上使用beforeUpload,反之customRequest。fileList 数组中每一个对象的url必须存在,才能触发图片预览时间,这个时候需要用到customRequest这个api。官网给出的案例无法使用封装好的请求方式上传图片,以及。不过——博主自己试出来了但是很遗憾,官网没有给出具体案例。

weixin_43726152的博客 3157

React+Css3图片预览(缩放、旋转、切换)

自己写的一个react缩放组件,主要通过CSS3的动画来实现的,有对应的介绍和使用方法。 这是之前发布的一个JQ版的缩放demo,原理差不多。 https://blog.csdn.net/weixin_43648947/article/details/88132986 一、新建的文件夹 newimg.jsx 这个里面是处理图片的子组件 import React, {Component} f...

@baby张~的博客 8508

react-antd中使用Upload实现图片裁剪-上传-预览的功能

前言 使用react中antd实现图片的上传裁剪和预览,记录一下实现过程,希望能对大家有帮助 实现 我们这里用到的是antd框架,实现 图片上传的功能我们需要安装一个插件antd-img-crop yarn add antd-img-crop 然后就可以进行使用: import React, { memo, useState } from 'react' import { Upload } from 'antd' import ImgCrop from ' ' export default memo(

weixin_45745641的博客 3153

【Python百日进阶-Web开发-Feffery】Day358 - fac数据展示13:AntdImage图片

文章目录前言:fac是什么?“人生苦短,我用Python;Web开发,首选Feffery!”↓↓↓ 今日笔记 ↓↓↓十三、fac数据展示:AntdImage图片13.1 语法与参数13.1.1 语法13.1.2 主要参数说明13.2 使用示例13.2.1 基础使用13.2.2 多图模式13.2.3 加载失败时的占位图 前言:fac是什么? feffery-antd-components(简称fac),是国内大佬费弗里(Feffery)老师基于著名的React UI组件库ant design进行二次开发,

专注于医院数据分析技术与系统开发的创作与分享。 802

别再混淆了!一张图看懂SAP特殊采购类30/40/70/80的区别与选型指南

本文深度解析SAP特殊采购类30/40/70/80的核心逻辑与业务影响,通过对比框架和真实案例帮助用户掌握其适用边界。重点介绍委外加工(类型30)、工厂间转移(类型40/70)及计划与执行分离(类型80)的配置要点与常见问题,提供选型决策树和实施检查清单,助力企业优化供应链管理。

weixin_26938645的博客 445

react + antd 封装一个图片预览,旋转,查看原图组件

最近在项目中的一个需求是, 小图点击可以弹框放大,然后能查看原图,顺时针一直旋转,每次90度。 实现方法: 使用react开发,所以直接选用antd 的组件, Upload 。结合CSS3的旋转属性;查看原图可以直接使用window.open()打开新的标签页。 实习代码: constructor(props){ super(props); ...

赵乘风_i 1万+

采用离散模型搭建永磁同步电机控制系统

永磁同步电机发电系统分为控制器和发电机,通过simulink仿真软件进行发电系统的离散系统仿真。离散搭建仿真,可以更方便的自动代码生成。通过实践经验离散模块搭建,更能加深对整个控制系统的理解。离散系统在矢量控制中经常涉及到上个开关周期的角度,电压,或者预测下个周期的角度,电流,一般都是通过延时模块实现。PWM比较值寄存器被改写后都是使能了预装载,采样后触发计算到比较值生效可以延时0.5个开关周期Ts,也可以延时1个开关周期Ts,可以通过离散系统进行仿真,大大缩短开发周期。

f1072239934的博客 2856

使用react-cropper结合图片压缩方法对图片进行裁剪压缩处理

最近项目要使用图片裁剪上传,因为项目采用的是react+antd,所以第一时间想到的是ImgCrop插件,但是这不满足项目需求,项目要求的是能够缩放裁剪框,最后确定了采用react-cropper来实现图片的自定义裁剪 安装react-cropper npm install --save react-cropper 新建一个CropperModal.jsx import React, { useState, useEffect, useCallback, useRef } from 'react' impo

weixin_43777074的博客 1284

成本会计(第九版)王忠孝课后习题答案解析

在掌握了基础知识之后,我们还需要培养自己的实际操作能力。此外,在学习过程中,遇到困难时,要及时向老师、同学请教,不要害怕暴露自己的不足。三人行,必有我师,每个人都有值得学习的地方。首先,我们需要认真阅读教材,把基础知识掌握牢固。在这里,我建议大家使用《成本会计(第九版)》的配套练习册,这样可以帮助我们检查学习效果。同时,网上的一些优质课程和论坛也是不错的学习资源,例如网易云课堂、中国大学MOOC等。别担心,这里我给大家推荐一些实用的学习资料和方法,帮助你更好地掌握这门课程。出版社: 大连理工大学出版社。

weixin_58833001的博客 1878

使用 CFD 仿真进行阀门性能分析:第一部分

了解如何使用 Ansys Discovery 评估阀门性能,使工程师能够设计出更好的产品。

jkh920184196的博客 3133

react结合antd-img-crop插件实现图片剪裁为圆形并上传

将一份格式为.PNG或.JPEG的图片剪裁为圆形并实现两张图片的上传。

weixin_70266895的博客 639

从代码学习深度强化学习 - 目标导向的强化学习-HER算法 PyTorch版

经典的深度强化学习算法,如 PPO、SAC 等,在各自擅长的任务中都取得了非常好的效果。但它们通常都局限在解决单个任务上,换句话说,训练好的算法,在运行时也只能完成一个特定的任务。想象一个场景:我们想让一个机械臂能把桌子上的任何一个物体重置到任意一个指定位置。对于传统强化学习而言,如果目标物体的初始位置和目标位置每次都变化,那么这就是一个全新的任务。即便任务的“格式”——抓取并移动——是一样的,但策略本身可能需要重新训练。这显然效率极低。为了解决这类问题,

weixin_43887510的博客 1490

Next/React聊天实例|next.js仿微信桌面端

Next-WebChat 基于Next.js+React.js仿微信网页聊天室 基于next.js+react.js+redux+react-redux+antd+rlayer等技术构建的pc网页聊天实例。实现了消息|表情动图发送、图片|视频播放预览、拖拽|粘贴截图发送、红包|朋友圈等功能。 技术栈 使用技术:Next.js+React+Redux+React-Redux UI组件库:Antd (react的pc端组件库) 字体图标:阿里iconfont图标库 弹窗组件:RLayer

码农ICoding 1518

MOSFET热失效机理与保护电路设计:实战案例

深入解析MOSFET工作原理及其在高温下的失效机制,结合实际案例探讨有效保护电路设计,提升系统可靠性与安全性。

weixin_28713083的博客 848

别再乱改基础库了!手把手教你搞定uni-app小程序上传图片报错(chooseAndUploadFile权限篇)

本文详细解析了uni-app开发微信小程序时遇到的`chooseAndUploadFile`权限报错问题,并提供了四步解决方案。从隐私协议与API权限的关联入手,指导开发者正确配置后台声明、双重提交策略和版本管理,避免降级基础库等常见误区,确保小程序合规运行。

weixin_33709364的博客 274

js 滚动条滚动到指定的位置_Next.js+React聊天室|next.js桌面端聊天

最近一直在捣鼓Next项目,Next.js是一个基于React.js的服务端ssr渲染框架,能够让你的react页面拥有SEO功能。Next.js的star高达58.8K+。一款非常受开发者青睐的React SSR框架。https://www.nextjs.cn/https://github.com/vercel/next.js项目简介Next-WebChat 基于next.js+react+re...

weixin_39682511的博客 550

【光子 AI 】应用 LangGraph 的核心模型和算法原理,完整实现一个极简版的 Agent 开发框架源代码,并给出具体的应用测试实际项目案例

下面给出一个“极简版 LangGraph 风格 Agent 框架”的完整可运行实现:用 有向图 + 状态(State) + 节点(Node) + 条件路由(Conditional Edge) + 循环(Loop) + Checkpoint 这一套核心模型/算法,把 Agent 组织成可编排、可测试的状态机工作流(这正是 LangGraph 的核心抽象之一:以 StateGraph 组织节点,节点读写共享状态,边做路由与循环,并支持持久化/回放)。 参考概念来源:LangGraph 官方文档对 “StateG

AI天才研究院 259

react动态菜单_Next.js+React聊天室|next.js桌面端聊天

最近一直在捣鼓Next项目,Next.js是一个基于React.js的服务端ssr渲染框架,能够让你的react页面拥有SEO功能。Next.js的star高达58.8K+。一款非常受开发者青睐的React SSR框架。https://www.nextjs.cn/https://github.com/vercel/next.js项目简介Next-WebChat 基于next.js+react+re...

weixin_36336710的博客 551

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

对于 React 结合 Antd 的 Upload 组件实现图片上传

一、 React 结合 Antd 实现图片上传 引入所需相关的组件和文件,代码如下所示: import React, { Component } from 'react' import PropTypes from 'prop-types' import { Upload, Icon, Modal, message } from 'antd' import { reqDeleteImg } from '../../api' import { BASE_IMG_URL } from '../../util

浮生离梦的博客 5478

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

antd+react实现html图片预览效果

/ 新增:用于跟踪拖动状态。

程序员—DaLi Sexy 1166

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: react antd select组件添加全选功能
下一篇: JS比较前后两个数组对象的差异
始于当下
博客等级 码龄5年 72粉丝 71原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

始于当下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值