0

We are fetching Mask images from JSON & display in page....

Once click on Mask, we are allowing users to upload image....

Requirement :

I want to get the Uploaded image's X,Y Position

enter image description here

container.getImagePosition = function() {
                return {
                    x: settings.x,
                    y: settings.y,
                    scale: settings.scale
                };
            };

container.getImagePosition();   

Below is Code snippet :

var target;

let jsonData = {
    "layers": [{
        "x": 0,
        "height": 612,
        "layers": [{
                "x": 160,
                "layers": [{
                    "x": 0,
                    "src": "ax0HVTs.png",
                    "y": 0,
                    "height": 296,
                    "width": 429,
                    "name": "L2b-1"
                }],
                "y": 291,
                "name": "user_image_1"
            },
            {
                "x": 25,
                "layers": [{
                    "x": 0,
                    "src": "hEM2kEP.png",
                    "height": 324,
                    "width": 471,
                    "y": 0,
                    "name": "L2C-1"
                }],
                "y": 22,
                "name": "L2"
            }
        ],
        "y": 0,
        "width": 612,
        "name": "L1"
    }]
};

const containerElement = $('#container');
const fileUp = $('#fileup');

$(function() {

    // below code will upload image onclick mask 

    containerElement.click(function(e) {

        var res = e.target;
        target = res.id;
        console.log(target);
        if (e.target.getContext) {
            // click only inside Non Transparent part
            var pixel = e.target.getContext('2d').getImageData(e.offsetX, e.offsetY, 1, 1).data;
            if (pixel[3] === 255) {
                setTimeout(() => {
                    $('#fileup').click();
                }, 20);
            }
        }
    });
    // Below code will fetch mask images from json file

    function getAllSrc(layers) {
        let arr = [];
        layers.forEach(layer => {
            if (layer.src) {
                arr.push({
                    src: layer.src,
                    x: layer.x,
                    y: layer.y,
                    height: layer.height,
                    width: layer.width,
                    name: layer.name
                });
            } else if (layer.layers) {
                let newArr = getAllSrc(layer.layers);
                if (newArr.length > 0) {
                    newArr.forEach(({
                        src,
                        x,
                        y,
                        height,
                        width,
                        name
                    }) => {
                        arr.push({
                            src,
                            x: (layer.x + x),
                            y: (layer.y + y),
                            height,
                            width,
                            name: (name)
                        });
                    });
                }
            }
        });
        return arr;
    }

    function json(data)

    {
        var width = 0;
        var height = 0;

        let arr = getAllSrc(data.layers);

        let layer1 = data.layers;
        width = layer1[0].width;
        height = layer1[0].height;
        let counter = 0;
        let table = [];

        containerElement.css('width', width + "px").css('height', height + "px").addClass('temp');

        for (let {
                src,
                x,
                y,
                name
            } of arr) {

            var imageUrl = imageUrl;

            var mask = $(".container").mask({
                imageUrl: imageUrl,
                maskImageUrl: 'https://i.imgur.com/' + src,
                onMaskImageCreate: function(img) {
                    // Mask image positions
                    img.css({
                        "position": "absolute",
                        "left": x + "px",
                        "top": y + "px"
                    });
                    // end

                },
                id: counter
            });
            table.push(mask);
            fileup.onchange = function() {

                let mask2 = table[target];
                const newImageLoadedId = mask2.loadImage(URL.createObjectURL(fileup.files[0]));
                document.getElementById('fileup').value = "";
            };
            counter++;
        }
    }
    json(jsonData);
}); // end of document ready



(function($) {
    var JQmasks = [];
    $.fn.mask = function(options) {
        // This is the easiest way to have default options.
        var settings = $.extend({
            // These are the defaults.
            maskImageUrl: undefined,
            imageUrl: undefined,
            scale: 1,
            id: new Date().getUTCMilliseconds().toString(),
            x: 0, // image start position
            y: 0, // image start position
            onMaskImageCreate: function(div) {},
        }, options);


        var container = $(this);

        let prevX = 0,
            prevY = 0,
            draggable = false,
            img,
            canvas,
            context,
            image,
            timeout,
            initImage = false,
            startX = settings.x,
            startY = settings.y,
            div;

        container.mousePosition = function(event) {
            return {
                x: event.pageX || event.offsetX,
                y: event.pageY || event.offsetY
            };
        }

        container.selected = function(ev) {
            var pos = container.mousePosition(ev);
            var item = $(".masked-img canvas").filter(function() {
                var offset = $(this).offset()
                var x = pos.x - offset.left;
                var y = pos.y - offset.top;
                var d = this.getContext('2d').getImageData(x, y, 1, 1).data;
                return d[0] > 0
            });

            JQmasks.forEach(function(el) {
                var id = item.length > 0 ? $(item).attr("id") : "";
                if (el.id == id)
                    el.item.enable();
                else el.item.disable();
            });
        };

        container.enable = function() {
            draggable = true;
            $(canvas).attr("active", "true");
            div.css({
                "z-index": 2
            });
        }

        container.disable = function() {
            draggable = false;
            $(canvas).attr("active", "false");
            div.css({
                "z-index": 1
            });
        }

        // images positions

        container.getImagePosition = function() {
            return {
                x: settings.x,
                y: settings.y,
                scale: settings.scale
            };
        };

        container.getImagePosition();

        container.updateStyle = function() {
            return new Promise((resolve, reject) => {
                context.beginPath();
                context.globalCompositeOperation = "source-over";
                image = new Image();
                image.setAttribute('crossOrigin', 'anonymous');
                image.src = settings.maskImageUrl;
                image.onload = function() {
                    canvas.width = image.width;
                    canvas.height = image.height;
                    context.drawImage(image, 0, 0, image.width, image.height);
                    div.css({
                        "width": image.width,
                        "height": image.height
                    });
                    resolve();
                };
            });
        };

        function renderInnerImage() {
            img = new Image();
            img.setAttribute('crossOrigin', 'anonymous');
            img.src = settings.imageUrl;
            img.onload = function() {
                settings.x = settings.x == 0 && initImage ? (canvas.width - (img.width * settings.scale)) / 2 : settings.x;
                settings.y = settings.y == 0 && initImage ? (canvas.height - (img.height * settings.scale)) / 2 : settings.y;
                context.globalCompositeOperation = 'source-atop';
                context.drawImage(img, settings.x, settings.y, img.width * settings.scale, img.height * settings.scale);
                initImage = false;
            };
        }

        container.loadImage = function(imageUrl) {
            console.log("load");
            //if (img)
            // img.remove();
            // reset the code.
            settings.y = startY;
            settings.x = startX;
            prevX = prevY = 0;
            settings.imageUrl = imageUrl;
            initImage = true;
            container.updateStyle().then(renderInnerImage);
            // sirpepole  Add this
            return settings.id;
        };


        // change the masked Image
        container.loadMaskImage = function(imageUrl, from) {
            canvas = document.createElement("canvas");
            context = canvas.getContext('2d');
            canvas.setAttribute("draggable", "true");
            canvas.setAttribute("id", settings.id);
            settings.maskImageUrl = imageUrl;
            div = $("<div/>", {
                "class": "masked-img"
            }).append(canvas);

            // div.find("canvas").on('touchstart mousedown', function(event)
            div.find("canvas").on('dragstart', function(event) {
                if (event.handled === false) return;
                event.handled = true;
                container.onDragStart(event);
            });

            div.find("canvas").on('touchend mouseup', function(event) {
                if (event.handled === false) return;
                event.handled = true;
                container.selected(event);
            });

            div.find("canvas").bind("dragover", container.onDragOver);
            container.append(div);
            if (settings.onMaskImageCreate)
                settings.onMaskImageCreate(div);
            container.loadImage(settings.imageUrl);
        };
        container.loadMaskImage(settings.maskImageUrl);
        JQmasks.push({
            item: container,
            id: settings.id
        })
        // Edit image
        div.addClass('masked-img' + settings.id);
        // code end
        return container;
    };
}(jQuery));
.container {
 background: silver;
 position: relative;
}

.container img {
 position: absolute;
 top: 0;
 bottom: 250px;
 left: 0;
 right: 0;
 margin: auto;
 z-index: 999;
}

.masked-img {
 overflow: hidden;
 position: relative;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="fileup" name="fileup" type="file" style="display:none" >
<div id="container"class="container"></div>

Here is Full code in Codepen & Fiddle

Please let me know if you have any other doubts....

Thanks in Advance....

1 Answers1

0

Is the use of div as container wanted ? Using canvas would be much more easy for this use case. You will go crazy using css for images manipulation !

But to answer your question, uploaded images will always have the same center than the mask image user clicked on. So you can easily calculate it with (mask image's center - uploaded image's dimensions)

Hope it helps !

PopHip
  • 700
  • 6
  • 23
  • Thanks, means are you telling i should not use x,y positions in json ? instead i should use canvas ? –  Apr 23 '19 at 07:40
  • No i mean, keep your data but do not set images position with absolute position, left and top css properties. Use Canvas instead, you will save a lot of time ! – PopHip Apr 23 '19 at 07:45
  • i have images like [this](http://139.59.24.243/ecom1/site/test/nisharg8images) , [this](http://139.59.24.243/ecom1/site/test/nisharg9images), i need to dislay all those 8 , 9 images in exact position as in that links..... –  Apr 23 '19 at 07:47
  • Look at the second answer to this post : https://stackoverflow.com/questions/18379818/canvas-image-masking-overlapping – PopHip Apr 23 '19 at 07:59
  • I was wrong sorry, you are actually using canvas but it seems this code isn't from you and that's why you do not understand it. Their is thousands threads about canvas and image masking, i would say this is not the right place to explain it again. – PopHip Apr 23 '19 at 08:18
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/192291/discussion-between-vickey-colors-and-pophip). –  Apr 24 '19 at 05:23