GIF在线生成器

上传图片就能生成GIF的前端WEB工具

源码也非常简单

<!DOCTYPE html>
<html lang="zh" class="dark">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
  <meta name="description" content="petpet generator">
  <meta name="theme-color" content="#ffeaa8">
  <meta property="og:title" content="petpet">
  <meta property="og:type" content="website">
  <meta property="og:url" content="https://benisland.neocities.org/petpet/">
  <meta property="og:image" itemprop="image" content="https://benisland.neocities.org/petpet/img/pet.png">
  <meta property="og:description" itemprop="description" content="petpet gif generator">
  <title>GIF在线生成器 </title>
  <link rel="icon" href="favicon.ico">

  <!-- Sanitize CSS -->
  <link href="https://unpkg.com/sanitize.css" rel="stylesheet" />
  <link href="https://unpkg.com/sanitize.css/forms.css" rel="stylesheet" />
  <link href="https://unpkg.com/sanitize.css/typography.css" rel="stylesheet" />

  <!-- External -->
  <link rel="stylesheet" href="https://unpkg.com/jam-icons/css/jam.min.css">
  <link href="https://fonts.googleapis.com/css2?family=Balsamiq+Sans:wght@700&family=Work+Sans:wght@400;600&display=swap"
        rel="stylesheet">

  <!-- CSS -->
  <link rel="stylesheet" href="style.css">
  <style type="text/css">
    .grid {
      margin: 0 auto;
      max-width: 48em;
      display: grid;
      grid-template-columns: 38.2% 61.8%;
      grid-template-areas:
        "header  header"
        "preview upload"
        "preview output"
        "footer  footer";
    }

    .header {
      grid-area: header;
      text-align: center;
      padding: 0.618em 0.618em 1.25em;
    }

    .preview {
      grid-area: preview;
      border-top-left-radius: 0.618em;
      border-bottom-left-radius: 0.618em;
      padding-right: 0;
    }

    .upload {
      grid-area: upload;
      border-top-right-radius: 0.618em;
    }

    .output {
      grid-area: output;
      border-bottom-right-radius: 0.618em;
    }

    .footer {
      grid-area: footer;
      text-align: center;
      padding: 1.618em;
    }

    .preview-canvas {
      margin: 0 auto 2.312em;
      max-width: 200px;
    }

    .preview-playback {
      display: flex;
    }

    .preview-playback .btn {
      border-top-right-radius: 0;
      border-top-left-radius: 0;
      flex-grow: 1;
    }

    .btn-playback-playpause.paused .btn-playback-pause,
    .btn-playback-playpause:not(.paused) .btn-playback-play {
      display: none;
    }

    .export-row {
      margin-top: 1.75em;
    }

    .output-info {
      color: var(--txt-light);
    }

    img[src]+.output-info {
      margin-top: 1em;
    }

    fieldset {
      padding: 0;
      margin: 0;
      border: 0;
    }

    #fpsVal {
      width: 4em;
      margin-left: 0.618em;
    }

    @media only screen and (max-width: 40em) {
      .grid {
        grid-template-columns: 100%;
        grid-template-areas:
          "header"
          "upload"
          "preview"
          "output"
          "footer";
      }

      .header,
      .footer,
      .content {
        padding: 1.618em 8%;
        border-radius: 0;
      }

      .preview {
        padding-left: 16%;
        padding-right: 16%;
      }

      .content,
      .footer {
        border-top: 1px solid var(--input-border);
      }

      .export-row {
        margin-top: 2.5em;
      }

      #fpsVal {
        width: 7em;
        font-size: small;
        padding: 0.5em;
        padding-right: 0.2em;
      }
    }

  </style>
  <script>/* change theme */ let theme = localStorage.getItem("theme"); theme || (theme = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"), document.documentElement.setAttribute("data-theme", theme), document.addEventListener("DOMContentLoaded", () => { document.querySelectorAll("a.e").forEach(x => { x.href = x.dataset.href }); const e = document.getElementById("color-theme"); e.checked = "dark" == theme, e.addEventListener("change", t => { theme = e.checked ? "dark" : "light", document.documentElement.setAttribute("data-theme", theme), localStorage.setItem("theme", theme) }) });</script>
</head>

<body>
  <main class="grid">
    <header class="header">
      <div class="heading">GIF在线生成 <input type="checkbox" id="color-theme" title="toggle theme"></div>
      <div>如果网页崩了,一定不是我的锅</div>
    </header>

    <section class="preview content">
      <div class="content-heading">预览</div>
      <div class="preview-canvas">
        <canvas height="112" width="112" id="canvas" class="canvas" tabindex="1"></canvas>
        <div class="preview-playback">
          <button id="prev" class="btn btn-playback-prev control-grouped-left">
            <i class="jam jam-set-backward"></i>
          </button>
          <button id="play" class="btn btn-playback-playpause control-grouped-center">
            <i class="jam jam-play btn-playback-play"></i>
            <i class="jam jam-pause btn-playback-pause"></i>
          </button>
          <button id="next" class="btn btn-playback-next control-grouped-right">
            <i class="jam jam-set-forward"></i>
          </button>
        </div>
      </div>

      <div class="preview-controls">
        <div class="row">
          <div class="control-group">
            <label for="toggleAdjust" class="control-group-l">细节调整</label>
            <label for="toggleAdjust" class="toggle-switch">
              <input id="toggleAdjust" type="checkbox" class="toggle-switch-input">
              <span class="toggle-switch-control"></span>
            </label>
          </div>
          <div class="hint">
            您可以使用鼠标/键盘/触控板移动图片细微调整 :-)
          </div>
        </div>
        <div class="row control-group">
          <label for="toggleFlip" class="control-group-l">翻转</label>
          <label for="toggleFlip" class="toggle-switch sm">
            <input id="toggleFlip" type="checkbox" class="toggle-switch-input">
            <span class="toggle-switch-control"></span>
          </label>
        </div>
        <div class="row control-group">
          <label for="scale" class="control-label control-group-s">尺寸</label>
          <input id="scale" class="control-range control-group-l" type="range" step="1" min="15" max="200" value="85">
        </div>
        <div class="row control-group">
          <label for="squish" class="control-label control-group-s">挤压</label>
          <input id="squish" class="control-range control-group-l" type="range" step="1" min="100" max="300"
                 value="125">
        </div>
        <div class="row control-group">
          <label for="fps" class="control-label control-group-s">速度</label>
          <input id="fps" class="control-range" type="range" step="2" min="2" max="60" value="16">
          <input type="number" id="fpsVal" class="control control-sm" step="1" min="2" max="60" value="16">
        </div>
        <div class="row export-row">
          <div class="control-group">
            <button id="reset" class="btn btn-reset control-group-s">重设</button>
            <div class="spacer" style="width:0.382em"></div>
            <button id="export" class="btn btn-export control-group-l">导出</button>
          </div>
        </div>

      </div>
    </section>

    <section class="upload content">
      <div class="content-heading">上传</div>
      <div class="upload-preview">
        <label class="drop-area preview-image-container" id="dropArea" for="uploadFile">
          <div class="drop-area-input">
            <input class="drop-area-file-input" type="file" id="uploadFile" accept="image/*">
            <img class="drop-area-preview preview-image" src="/fancypig.png" id="uploadPreview">
            <div class="drop-area-upload" for="uploadFile">
              <label for="uploadFile" class="drop-area-upload-btn btn">选择文件</label>
              <label id="uploadFileName" class="drop-area-upload-filename">或者直接拖进来</label>
            </div>
          </div>
        </label>
        <div class="row control-group">
          <input class="control control-group-l control-has-icon control-grouped-left" type="url" required
                 placeholder="输入图片URL地址" id="uploadUrl">
          <button type="submit" class="btn control-icon control-grouped-right" id="uploadUrlBtn"><i
               class="jam jam-upload"></i></button>
        </div>
        <p id="uploadError" class="error-message"></p>
        <p class="help">温馨提示:上传图片URL不一定 <a data-href="https://www.genban.org" target="_blank"
             class="e">有效</a> 因为有些网站做了跨域限制</p>
      </div>
    </section>

    <section class="output content">
      <div class="content-heading">输出</div>
      <figure class="preview-image-container">
        <img width="112" height="112" class="preview-image" id="result">
        <div class="help output-info" id="info">...</div>
      </figure>
      <p class="help">
        <a data-href='https://www.genban.org' target="_blank" class="e">备注:</a> 请将图片保存到本地,不要直接复制图片地址
      </p>
      <p class="help">如果输出中出现了奇怪的绿点,请换个浏览器。</p>
    </section>

    <footer class="footer help">
      
      <br>
      
      <br>
    </footer>
  </main>

  <script src="requestInterval.js"></script>
  <script src="gif.js"></script>
  <script src="main.js"></script>
</body>

</html>

直接使用http-server启动或者别的WEB服务启动即可

项目地址:https://download.csdn.net/download/Highning0007/89109298

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/529415.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式学习笔记 - 设计模式与范式 -行为型:8.状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

概述 本章学习状态模式。在实际的开发中&#xff0c;状态模式并不是很常用&#xff0c;但是在能够用到的场景里&#xff0c;它可以发挥很大的作用。从这一点上看&#xff0c;它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机&#xff0c;而状态机常用在游戏、工…

前端三剑客 —— JavaScript (第一节)

目录 回顾内容 1.弹性布局 2.网格布局 JavaScript 概述 发展 浏览器 什么是Javascript JavaScript 能干什么 JavaScript需要的环境 JavaScript初体验 基本数据 JS书写方式 行内JS 页面JS 外部JS 1&#xff09;创建外部JS文件 2&#xff09;编写页面 对话框 警…

类的函数成员(四):赋值函数

一.赋值函数是什么&#xff1f; 1.1 运算符的重载 运算符的重载实际是一种特殊的函数重载&#xff0c;必须定义一个函数&#xff0c;并告诉C编译器&#xff0c;当遇到该重载的运算符时调用此函数。这个函数叫做运算符重载函数&#xff0c;它通常为类的成员函数。 定义运算符重…

TCP 重传、滑动窗口、流量控制、拥塞控制(计算机网络)

重传机制 TCP 针对数据包丢失的情况&#xff0c;会用重传机制解决。 接下来说说常见的重传机制&#xff1a; 超时重传快速重传SACKD-SACK 超时重传 重传机制的其中一个方式&#xff0c;就是在发送数据时&#xff0c;设定一个定时器&#xff0c;当超过指定的时间后&#xff0c…

HarmonyOS实战开发-如何使用 geolocation 实现获取当前位置经纬度

介绍 本示例使用 geolocation 实现获取当前位置的经纬度,然后通过 http 将经纬度作为请求参数,获取到该经纬度所在的城市。通过 AlphabetIndexer 容器组件实现按逻辑结构快速定位容器显示区域。 效果预览 使用说明 1.进入主页,点击国内热门城市,配送地址会更新为选择的城…

javaScript 事件循环 Event Loop

一、前言 javaScript 是单线程的编程语言&#xff0c;只能同一时间内做一件事情&#xff0c;按照顺序来处理事件&#xff0c;但是在遇到异步事件的时候&#xff0c;js线程并没有阻塞&#xff0c;还会继续执行&#xff0c;这又是为什么呢&#xff1f; 二、基础知识 堆&#x…

vivado HDL 例化调试探测流程概述

HDL 例化调试探测流程概述 HDL 例化探测流程涉及在 HDL 设计源代码中直接手动自定义、例化和连接各种调试核组件。下表中显示了 Vivado 工具中此流程所支持的新调试核。 新的 ILA 核相比于传统 ILA v1.x 核具有以下 2 大优势 &#xff1a; • 可搭配集成的 Vivado Log…

FreeRTOS临界段代码保护和任务调度器的挂起与恢复学习

FreeRTOS临界段代码保护和任务调度器的挂起与恢复学习 临界段代码保护 所谓临界段代码保护就是指必须完成运行&#xff0c;不能被打断的代码段。比如需要严格按照时序除初始化的外设&#xff1a;IIC、SPI&#xff0c;再或者因为系统自身需求和用户需求。 FreeRTOS 在进入临界…

发型不满意试试开源AI换发型HairFastGAN;前OpenAI员工Karpathy1000纯C语言写完GPT-2

✨ 1: HairFastGAN 开源AI换发型 HairFastGAN 是一种先进的技术&#xff0c;专门设计用于在不同图片之间传输发型。这意味着如果你有一张人物的图片和另一张你喜欢的发型的图片&#xff0c;HairFastGAN 能够将你喜欢的那个发型复制到人物的头上&#xff0c;而且看起来非常自然…

强化学习MPC——(二)

本篇主要介绍马尔科夫决策&#xff08;MDP&#xff09;过程&#xff0c;在介绍MDP之前&#xff0c;还需要对MP&#xff0c;MRP过程进行分析。 什么是马尔科夫&#xff0c;说白了就是带遗忘性质&#xff0c;下一个状态S_t1仅与当前状态有关&#xff0c;而与之前的状态无关。 为…

深入浅出索引(上)

提到数据库索引&#xff0c;我想你并不陌生&#xff0c;在日常工作中会经常接触到。比如某一个 SQL 查询比较慢&#xff0c;分析完原因之后&#xff0c;你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引&#xff0c;索引又是如何工作的呢&#xff1f;今天…

NPW(监控片的)上---基础知识要点精讲

半导体的生产过程已经历经数十年的发展&#xff0c;其中主要有两个大的发展趋势&#xff0c;第一&#xff0c;晶圆尺寸越做越大&#xff0c;到目前已有超过70%的产能是12寸晶圆&#xff0c;不过18寸晶圆产业链推进缓慢&#xff1b;第二&#xff0c;电子器件的关键尺寸越做越小&…

【面试题】如何在级别用户中检查用户名是否存在?

前言 不知道大家有没有留意过&#xff0c;在使用一些app或者网站注册的时候&#xff0c;提示你用户名已经被占用了&#xff0c;比如我们熟知的《英雄联盟》有些人不知道取啥名字&#xff0c;干脆就叫“不知道取啥名”。 但是有这样困惑的可不止他一个&#xff0c;于是就出现了…

转圈游戏——快速幂

目录 题目 思路 代码 题目 思路 每个小朋友移动一次的位置为&#xff0c;移动 q 次的位置则为。那么题目要求移动 &#xff0c;最后的位置为 。 但 的范围是&#xff0c;而总的移动次数是 。时间复杂度是在&#xff0c;因此是一定不能硬算的&#xff0c;肯定会超时。那么该…

苍穹外卖——员工管理,分类管理

内容 新增员工(重点)员工分页查询(重点)启用禁用员工账号编辑员工(重点)导入分类模块功能代码**功能实现&#xff1a;**员工管理、菜品分类管理。 员工管理效果&#xff1a;菜品分类管理效果&#xff1a; 1.新增员工 1.1 需求分析设计 1.1.1产品原型 一般在做需求分析时&a…

【VUE】Vue3+Element Plus动态间距处理

目录 1. 动态间距调整1.1 效果演示1.2 代码演示 2. 固定间距2.1 效果演示2.2 代码演示 其他情况 1. 动态间距调整 1.1 效果演示 并行效果 并列效果 1.2 代码演示 <template><div style"margin-bottom: 15px">direction:<el-radio v-model"d…

知识图谱的实际应用案例分析

知识图谱的实际应用案例分析 一、引言 知识图谱的重要性 在如今这个数据驱动的时代&#xff0c;数据已经成为了新的石油&#xff0c;而知识图谱则是我们提炼这种石油的精炼厂。知识图谱&#xff0c;一种将现实世界中的实体以及这些实体之间的复杂关系进行结构化表示的技术&am…

HarmonyOS开发实例:【状态管理】

状态管理 ArkUI开发框架提供了多维度的状态管理机制&#xff0c;和UI相关联的数据&#xff0c;不仅可以在组件内使用&#xff0c;还可以在不同组件层级间传递&#xff0c;比如父子组件之间&#xff0c;爷孙组件之间等&#xff0c;也可以是全局范围内的传递&#xff0c;还可以是…

C++数据结构与算法——贪心算法中等题

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

分享Fork/Join经典案例

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 在上一篇的文章java 多线程分治求和&#xff0c;太牛了的文章中&#xff0c;提到…