图片Base64二进制格式保存为图片文件

1 篇文章 0 订阅

图片Base64二进制格式保存为图片文件

html代码

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Signature Pad demo</title>
  <meta name="description" content="Signature Pad - HTML5 canvas based smooth signature drawing using variable width spline interpolation.">

  <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">

  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">

  <link rel="stylesheet" href="css/signature-pad.css">

  <!--[if IE]>
    <link rel="stylesheet" type="text/css" href="css/ie9.css">
  <![endif]-->

  <script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-39365077-1']);
    _gaq.push(['_trackPageview']);

    (function () {
      //var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
      //ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
      //var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();
  </script>
</head>
<body onselectstart="return false">

  <div id="signature-pad" class="signature-pad">
    <div>
      <!--<button type="button" class="button iframeBtn" data-action="change-color">切换颜色</button>-->
    </div>
    <div class="signature-pad--body">
      <canvas></canvas>
    </div>
    <div class="signature-pad--footer">
      <div class="description">请在上面签名</div>

      <div class="signature-pad--actions">
        <div>
          <button type="button" class="button iframeBtn" data-action="clear">清除</button>
          <button type="button" class="button iframeBtn" data-action="undo">撤销</button>

        </div>
        <div>
          <!--<button type="button" class="button iframeBtn" data-action="save-png">Save as PNG</button>-->
          <button type="button" class="button iframeBtn" data-action="save-jpg" style="background-color: #1890ff; border-color: #1890ff;">保存</button>
          <!--<button type="button" class="button iframeBtn" data-action="save-svg">Save as SVG</button>-->
          <button type="button" class="button iframeBtn" style="background-color: #f5222d;border-color: #f5222d;">取消</button>
        </div>
      </div>
    </div>
  </div>
  <script src="js/jquery.js"></script>
  <script src="js/signature_pad.umd.js"></script>
  <script src="js/app.js"></script>
</body>
</html>


前端代码

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

var wrapper = document.getElementById("signature-pad");
var clearButton = wrapper.querySelector("[data-action=clear]");
var changeColorButton = wrapper.querySelector("[data-action=change-color]");
var undoButton = wrapper.querySelector("[data-action=undo]");
var savePNGButton = wrapper.querySelector("[data-action=save-png]");
var saveJPGButton = wrapper.querySelector("[data-action=save-jpg]");
var saveSVGButton = wrapper.querySelector("[data-action=save-svg]");
var canvas = wrapper.querySelector("canvas");
var signaturePad = new SignaturePad(canvas, {
  // It's Necessary to use an opaque color when saving image as JPEG;
  // this option can be omitted if only saving as PNG or SVG
  backgroundColor: 'rgb(255, 255, 255)'
});

// Adjust canvas coordinate space taking into account pixel ratio,
// to make it look crisp on mobile devices.
// This also causes canvas to be cleared.
function resizeCanvas() {
  // When zoomed out to less than 100%, for some very strange reason,
  // some browsers report devicePixelRatio as less than 1
  // and only part of the canvas is cleared then.
  var ratio =  Math.max(window.devicePixelRatio || 1, 1);

  // This part causes the canvas to be cleared
  canvas.width = canvas.offsetWidth * ratio;
  canvas.height = canvas.offsetHeight * ratio;
  canvas.getContext("2d").scale(ratio, ratio);

  // This library does not listen for canvas changes, so after the canvas is automatically
  // cleared by the browser, SignaturePad#isEmpty might still return false, even though the
  // canvas looks empty, because the internal data of this library wasn't cleared. To make sure
  // that the state of this library is consistent with visual state of the canvas, you
  // have to clear it manually.
  signaturePad.clear();
}

// On mobile devices it might make more sense to listen to orientation change,
// rather than window resize events.
window.onresize = resizeCanvas;
resizeCanvas();

function download(dataURL, filename) {
  if (navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1) {
    window.open(dataURL);
  } else {
    //上传到服务器
    var arr = dataURL.split(','), mime = arr[0].match(/:(.*?);/)[1],
      bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n);
    }

    var obj = new Blob([u8arr], { type: mime });
    var fd = new FormData();
    fd.append("file", obj, "image.png");

    $.ajax({
      type: 'post',
      url: 'http://localhost:8001/Base32Sys/YearExperimentPlan/Control/PadJk.ashx?Action=UpLoadFile',
      processData: false,
      contentType: false,
      data: fd,
      crossDomain: true,
      success: function (data) {
        alert(data);
      },
      error: function (error) {
        alert(error);
      }
    })
  }
}

// One could simply use Canvas#toBlob method instead, but it's just to show
// that it can be done using result of SignaturePad#toDataURL.
function dataURLToBlob(dataURL) {
  // Code taken from https://github.com/ebidel/filer.js
  var parts = dataURL.split(';base64,');
  var contentType = parts[0].split(":")[1];
  var raw = window.atob(parts[1]);
  var rawLength = raw.length;
  var uInt8Array = new Uint8Array(rawLength);

  for (var i = 0; i < rawLength; ++i) {
    uInt8Array[i] = raw.charCodeAt(i);
  }

  return new Blob([uInt8Array], { type: contentType });
}

clearButton.addEventListener("click", function (event) {
  signaturePad.clear();
});

undoButton.addEventListener("click", function (event) {
  var data = signaturePad.toData();

  if (data) {
    data.pop(); // remove the last dot or line
    signaturePad.fromData(data);
  }
});

//changeColorButton.addEventListener("click", function (event) {
//  var r = Math.round(Math.random() * 255);
//  var g = Math.round(Math.random() * 255);
//  var b = Math.round(Math.random() * 255);
//  var color = "rgb(" + r + "," + g + "," + b +")";

//  signaturePad.penColor = color;
//});

//savePNGButton.addEventListener("click", function (event) {
//  if (signaturePad.isEmpty()) {
//    alert("Please provide a signature first.");
//  } else {
//    var dataURL = signaturePad.toDataURL();
//    download(dataURL, "signature.png");
//  }
//});

saveJPGButton.addEventListener("click", function (event) {
  if (signaturePad.isEmpty()) {
    alert("Please provide a signature first.");
  } else {
    var dataURL = signaturePad.toDataURL("image/jpeg");
    download(dataURL, "signature.jpg");
  }
});

//saveSVGButton.addEventListener("click", function (event) {
//  if (signaturePad.isEmpty()) {
//    alert("Please provide a signature first.");
//  } else {
//    var dataURL = signaturePad.toDataURL('image/svg+xml');
//    download(dataURL, "signature.svg");
//  }
//});


后端代码

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

private string UpLoadFile(HttpContext context)
    {
        try
        {
            //接收post file 文件
            HttpPostedFile file = context.Request.Files["file"];
            //文件类型
            string fileType = System.IO.Path.GetExtension(file.FileName);
            //保存文件路径
            string filePathName = HttpContext.Current.Server.MapPath("..") + "\\File\\";
            //文件名称
            string fileName = file.FileName;
            //文件重新命名
            string fileNameNew = System.DateTime.Now.ToString("yyMMddHHmmss") + "_" + fileName;
            //保存file
            if (!System.IO.Directory.Exists(filePathName))
            {
                System.IO.Directory.CreateDirectory(filePathName);
            }
            file.SaveAs(System.IO.Path.Combine(filePathName, fileNameNew));
            
            return JsonConvert.SerializeObject(new PM_AnnexInfo()
            {
                ID = Guid.NewGuid().ToString(),
                FILEURL = filePathName + fileNameNew
            });
        }
        catch (Exception ex)
        {

            return string.Format("error:{0}",ex);
        }
        

        
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值