Tuesday, May 31, 2022

Canvas to JPEG for Crystal Report C# MVC

 Canvas always returns images in png format. But for crystal report, it does not accept png. So it is necessary to convert png to jpeg image format.

Steps:

1. From base64 get byte array.  (png)

2. then convert to a logical file. (png)

3. get the logical file and convert it to a jpeg file (bitmap png to jpeg)

4. get a jpeg logical file and convert it to the binary array.

5. save in the database. Field Type varbinary(max)



View::


@model gBanker.Web.ViewModels.MemberInfoViewModel

@{

    ViewBag.Title = "DigitalSignature";

    Layout = "~/Views/Shared/_LayoutMaster.cshtml";

}


<h2>Add Digital Signature</h2>



@using (Html.BeginForm("DigitalSignature", "newMember", FormMethod.Post, new { id = "drawingForm" }))

{


    @Html.HiddenFor(model => model.MemberID)

<div class="row">

    <div class="col-md-4">

        <div class="form-group">

            @Html.LabelFor(model => model.CenterID, htmlAttributes: new { @class = "control-label" })

            @Html.TextBox(" ", ViewData["CenterID"].ToString(), new { @ID = "CenterID", @class = "form-control", @readonly = true })

            @Html.ValidationMessageFor(model => model.CenterID, "", new { @class = "text-danger" })

        </div>

    </div>

    <div class="col-md-4">

        <div class="form-group">

            @Html.LabelFor(model => model.MemberCode, htmlAttributes: new { @class = "control-label" })

            @Html.TextBox(" ", ViewData["MemberCode"].ToString(), new { @ID = "MemberCode", @class = "form-control", @readonly = true })

            @Html.ValidationMessageFor(model => model.MemberCode, "", new { @class = "text-danger" })

        </div>

    </div>


     


</div>

<div class="row">

    <div class="col-md-5">

        <input type="hidden" name="imageData" id="imageData" />

        <input type="hidden" MemberId_Sig="@ViewData["MemberID"]" />

        <canvas id="kfCanvas" name="kfCanvas" typeof="jpg" height="300px;" width="400px;" style="border: 3px dotted #000;  cursor: crosshair;">

            Sorry, your browser doesn't support canvas technology.

        </canvas>

    </div>

    <div class="col-md-3">

        <input type="submit" id="btnSave" class="btn btn-success" onfocus="SetBase64();" value="Save Signature" />

        <input type="button" id="btnClear" class="btn btn-warning" value="Clear" onclick="erase();" />

    </div>

    </div>


<div class="row">

    

    <div class="col-md-3"><h4>4 of 4 pages</h4><label>@ViewBag.Message</label></div>

    <div class="col-md-3">

        <div class="form-group">


        </div>

    </div>

</div>

    <div class="row">


        <div style="height:350px; margin:10px;">

            <img id="rsDiagram" src="" class="partDiagram">

        </div>

        <!-- Button for calling ajax request -->

        <button type="button" class="btn btn-primary" onclick="ShowImage();" data-toggle="modal" data-target="">

            Load Signature

        </button>


    </div>

    <img id="rsDiagram2" src="" class="partDiagram">


    }

    <script>


        var canvas, ctx, flag = false,

            prevX = 0,

            currX = 0,

            prevY = 0,

            currY = 0,

            dot_flag = false;


        var x = "black",

            y = 2.5;


        function initSignatureInput() {

            canvas = document.getElementById('kfCanvas');

            ctx = canvas.getContext("2d");

            w = canvas.width;

            h = canvas.height;


            canvas.addEventListener("mousemove", function (e) {

                findxy('move', e)

            }, false);

            canvas.addEventListener("mousedown", function (e) {

                findxy('down', e)

            }, false);

            canvas.addEventListener("mouseup", function (e) {

                findxy('up', e)

            }, false);

            canvas.addEventListener("mouseout", function (e) {

                findxy('out', e)

            }, false);

        }


        function color(obj) {

            switch (obj.id) {

                case "green":

                    x = "green";

                    break;

                case "blue":

                    x = "blue";

                    break;

                case "red":

                    x = "red";

                    break;

                case "yellow":

                    x = "yellow";

                    break;

                case "orange":

                    x = "orange";

                    break;

                case "black":

                    x = "black";

                    break;

                case "white":

                    x = "white";

                    break;

            }

            if (x == "white") y = 14;

            else y = 2.5;


        }


        function draw() {


            ctx.beginPath();

            ctx.lineCap = 'round';

            ctx.moveTo(prevX, prevY);


            ctx.lineTo(currX, currY);

            ctx.strokeStyle = x;

            ctx.lineWidth = y;

            ctx.stroke();

            ctx.closePath();

        }


        function erase() {

            var m = confirm("Want to clear");

            if (m) {

                ctx.clearRect(0, 0, w, h);

            }

        }



        //function draw2() {

        //    ctx.beginPath();

        //    ctx.moveTo(prevX, prevY);

        //    ctx.lineTo(currX, currY);

        //    ctx.strokeStyle = x;

        //    ctx.lineWidth = y;

        //    ctx.stroke();

        //    ctx.closePath();

        //}

        function findxy(res, e) {

            // var staticX = 33, staticY = 13;

            var staticX = 30, staticY = 120;

            if (res == 'down') {


                prevX = currX;

                prevY = currY;

                //currX = e.clientX - (canvas.offsetLeft+235);

                //currY = e.clientY - (canvas.offsetTop +135);

                currX = (e.pageX - canvas.offsetLeft) - canvas.width / 2;

                currY = (e.pageY - canvas.offsetTop) - canvas.height / 2;


                currX -= staticX;

                currY -= staticY;


                flag = true;


            }

            if (res == 'up' || res == "out") {

                flag = false;

            }

            if (res == 'move') {

                if (flag) {

                    prevX = currX;

                    prevY = currY;

                    // currX = e.clientX - (canvas.offsetLeft + 235);

                    // currY = e.clientY - (canvas.offsetTop + 135);

                    currX = (e.pageX - canvas.offsetLeft) - canvas.width / 2;

                    currY = (e.pageY - canvas.offsetTop) - canvas.height / 2;


                    currX -= staticX;

                    currY -= staticY;


                    draw();

                }

            }

        }

        initSignatureInput();



        function SetBase64() {

            var image = document.getElementById("kfCanvas").toDataURL("image/png");

            //var image = document.getElementById("kfCanvas").toDataURL();

            // image = image.replace('data:image/png;base64,', '');

            //image = image.replace('data:image/png;base64,', '');


            document.getElementById('rsDiagram2').src = image;


            //var rsDiagram = $("#rsDiagram").attr('src');

            $('#imageData').val(image);



        }


        function ShowImage() {

            //alert($('#MemberID').val());

            $.ajax({

                type: "GET",

                url: "/NewMember/RSView/",

                data: { MemberID: $('#MemberID').val() },

                success: function (response) {

                    // console.log(response);

                    // alert(response);

                    $("#rsDiagram").attr('src', 'data:image/png;base64,' + response);

                },

                error: function (response) {

                    alert(response.responseText);

                }

            });




        }// END Show Image


        $(document).ready(function () {

        });// END document Ready


    </script>





IN Controller: 



        [HttpPost]

        public ActionResult DigitalSignature()

        {

            string Message_ = "Signature Saved.";

            MemberInfoViewModel obj = new MemberInfoViewModel();

            try

            {

                NameValueCollection nvc = Request.Form;

                string memberIDs = nvc["MemberID"];

                var imageDatas = nvc["imageData"];


                var member = memberService.GetByIdLong(Convert.ToInt32(memberIDs));

                ViewData["CenterID"] = centerService.GetById(member.CenterID).CenterName;

                ViewData["MemberID"] = member.MemberID;

                ViewData["MemberCode"] = member.MemberCode;


                imageDatas = imageDatas.Substring(22);


                byte[] data = Convert.FromBase64String(imageDatas);


                // test: Save image 


                string fileName = Guid.NewGuid().ToString() + ".png";

                byte[] imageBytes = data;

                MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);

                ms.Write(imageBytes, 0, imageBytes.Length);

                System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true);

                image.Save(Server.MapPath("~/CapturedImages/" + fileName),

                    System.Drawing.Imaging.ImageFormat.Png);

                //prphoto.ImageName = "/Uploads/" + fileName;


                // END Save Image


                // Get Image and Convert to jpg


                // Assumes myImage is the PNG you are converting

                string imageName = Server.MapPath("~/CapturedImages/" + fileName);//@"~/CapturedImages/" + fileName;


                //var ifExist = System.IO.File.Exists(imageName);

                var imageFile = System.IO.File.Open(imageName, FileMode.Open);


                Image myImage = Image.FromStream(imageFile);


                //myImage.Save(Server.MapPath("~/CapturedImages/" + fileName),

                //    System.Drawing.Imaging.ImageFormat.Jpeg);


                string fileNameJPEG = "";

                using (var b = new Bitmap(myImage.Width, myImage.Height))

                {

                    b.SetResolution(myImage.HorizontalResolution, myImage.VerticalResolution);


                    using (var g = Graphics.FromImage(b))

                    {

                        g.Clear(Color.White);

                        g.DrawImageUnscaled(myImage, 0, 0);

                    }


                    myImage.Dispose();

                    imageFile.Close();


                    fileNameJPEG = Guid.NewGuid().ToString() + ".jpeg";

                    b.Save(Server.MapPath("~/CapturedImages/" + fileNameJPEG),

                    System.Drawing.Imaging.ImageFormat.Jpeg);

                }


                // END jpg


                // Convert jpeg to byte Array and save


                string imageNameJPEG = Server.MapPath("~/CapturedImages/" + fileNameJPEG);//@"~/CapturedImages/" + fileName;


                //var ifExistJPEG = System.IO.File.Exists(imageNameJPEG);

                var imageFileJPEG = System.IO.File.Open(imageNameJPEG, FileMode.Open);


                var memoryStream = new MemoryStream();

                imageFileJPEG.CopyTo(memoryStream);

                var dataJPEG = memoryStream.ToArray();

                imageFileJPEG.Close();



                var objs = memberService.GetById(Convert.ToInt32(memberIDs));

                objs.DigitalSignature = dataJPEG;

                memberService.Update(objs);



                // Delete png and JPEG file

                System.IO.File.Delete(imageNameJPEG);

                System.IO.File.Delete(imageName);


                //END Delete


                //var objs = memberService.GetById(Convert.ToInt32(memberIDs));

                //objs.DigitalSignature = data;

                //memberService.Update(objs);

            }

            catch (Exception ex)

            {

                return GetErrorMessageResult("Sorry, Please try again.");

            }

            ViewBag.Message = Message_;


            return GetSuccessMessageResult("Signature Added.");

        }



        public ActionResult RSView(long MemberID)

        {

            var member = memberService.GetByIdLong(Convert.ToInt32(MemberID));

            string fileToSend = Convert.ToBase64String(member.DigitalSignature);

            return Json(fileToSend,JsonRequestBehavior.AllowGet);

        }













Screen Record

 Windows Screen Record WindowsKey+ Alt + R Recording Starts.