এইচটিএমএল 5 ক্যানভাসে একটি চিত্র পুনরায় আকার দিচ্ছে


314

আমি জাভাস্ক্রিপ্ট এবং ক্যানভাস উপাদান ব্যবহার করে ক্লায়েন্টের পাশে একটি থাম্বনেইল চিত্র তৈরি করার চেষ্টা করছি, তবে আমি যখন চিত্রটি নীচে সঙ্কুচিত করি তখন এটি দেখতে ভয়ঙ্কর লাগে। দেখে মনে হচ্ছে এটি ফটোশপটিতে পুনর্নির্মাণের সেটটি বাইকুবিকের পরিবর্তে 'নিকটবর্তী নিকটবর্তী' এ সেট করা হয়েছে। আমি এটি দেখতে সঠিকভাবে পাওয়া সম্ভব জানি কারণ এই সাইটটি এটি একটি ক্যানভাস ব্যবহার করে ঠিকঠাক করতে পারে। তারা "[উত্স]" লিঙ্কে দেখানো মত একই কোড ব্যবহার করার চেষ্টা করেছি, তবে এটি এখনও ভয়ঙ্কর দেখাচ্ছে। আমি কি অনুপস্থিত কিছু আছে, কিছু সেটিং যা সেট করা প্রয়োজন?

সম্পাদনা করুন:

আমি একটি জেপিজিকে পুনরায় আকার দেওয়ার চেষ্টা করছি। আমি লিঙ্কযুক্ত সাইটে এবং ফটোশপে একই জেপিজিকে পুনরায় আকার দেওয়ার চেষ্টা করেছি এবং ডাউনসাইজ করার সময় এটি দুর্দান্ত দেখাবে।

এখানে প্রাসঙ্গিক কোড:

reader.onloadend = function(e)
{
    var img = new Image();
    var ctx = canvas.getContext("2d");
    var canvasCopy = document.createElement("canvas");
    var copyContext = canvasCopy.getContext("2d");

    img.onload = function()
    {
        var ratio = 1;

        if(img.width > maxWidth)
            ratio = maxWidth / img.width;
        else if(img.height > maxHeight)
            ratio = maxHeight / img.height;

        canvasCopy.width = img.width;
        canvasCopy.height = img.height;
        copyContext.drawImage(img, 0, 0);

        canvas.width = img.width * ratio;
        canvas.height = img.height * ratio;
        ctx.drawImage(canvasCopy, 0, 0, canvasCopy.width, canvasCopy.height, 0, 0, canvas.width, canvas.height);
    };

    img.src = reader.result;
}

EDIT2:

দেখে মনে হচ্ছে আমার ভুল হয়েছে, লিঙ্কযুক্ত ওয়েবসাইটটি চিত্রটিকে হ্রাস করার মতো কোনও কাজ করে নি। আমি প্রস্তাবিত অন্যান্য পদ্ধতিগুলি চেষ্টা করেছিলাম এবং সেগুলির কোনওটির চেয়ে ভাল দেখাচ্ছে। বিভিন্ন পদ্ধতির ফলস্বরূপ এটি:

ফটোশপ:

বিকল্প পাঠ

ক্যানভাস:

বিকল্প পাঠ

চিত্র-রেন্ডারিং সহ চিত্র: অনুকূলিতকরণ মান এবং প্রস্থ / উচ্চতা দিয়ে মাপানো:

বিকল্প পাঠ

চিত্র-রেন্ডারিং সহ চিত্র: অনুকূলিতকরণের মানটি -মোজ-ট্রান্সফর্মের সাথে মাপসই করুন:

বিকল্প পাঠ

ক্যানভাসের আকার পিক্সেস্টিক:

বিকল্প পাঠ

আমি অনুমান করি এর অর্থ ফায়ারফক্সটি বাইকুবিক স্যাম্পলিংটিকে অনুমিত করার মতো ব্যবহার করছে না। তারা কেবল এটি যুক্ত না করা পর্যন্ত আমাকে অপেক্ষা করতে হবে।

EDIT3:

আসল চিত্র


আপনি ইমেজটির আকার পরিবর্তন করতে যে কোডটি ব্যবহার করছেন তা পোস্ট করতে পারেন?
জাভি

আপনি কি সীমিত প্যালেট সহ কোনও জিআইএফ চিত্র বা অনুরূপ চিত্রটির আকার পরিবর্তন করতে চেষ্টা করছেন? এমনকি ফটোশপে এই চিত্রগুলি আরজিবিতে রূপান্তর না করা পর্যন্ত ভাল স্কেল হয় না।
leepowers

আপনি কি মূল চিত্রটির একটি অনুলিপি পোস্ট করতে পারেন?
জাভি

জাভাস্ক্রিপ্ট ব্যবহার করে চিত্রটির আকার পরিবর্তন করা কিছুটা ক্লডজ - আপনি কেবল চিত্রটিকে পুনরায় আকার দেওয়ার জন্য ক্লায়েন্ট প্রসেসিং শক্তি ব্যবহার করছেন না, আপনি প্রতিটি পৃষ্ঠার লোডে এটি করছেন। কেন কেবল ফটোশপ থেকে একটি ডাউনস্কেলড সংস্করণ সংরক্ষণ করুন এবং এর পরিবর্তে / মূল চিত্রটির সাথে পরিবেশন করবেন না?
সংজ্ঞায়িত করে

29
কারণ আমি ছবি আপলোড করার আগে আকার পরিবর্তন এবং ক্রপ করার ক্ষমতা সহ একটি চিত্র আপলোডার তৈরি করছি।
টেলানোর

উত্তর:


393

সুতরাং যদি সমস্ত ব্রাউজারগুলি (প্রকৃতপক্ষে, ক্রোম 5 আমাকে বেশ ভাল দেয়) আপনি কীভাবে পুনরায় মডেলিংয়ের মানটি যথেষ্ট পরিমাণে দিতে না চান? আপনি নিজে এগুলি তখন বাস্তবায়ন করুন! ওহে আসুন, আমরা ওয়েব 3.0 এর নতুন যুগে প্রবেশ করছি, এইচটিএমএল 5 কমপ্লায়েন্ট ব্রাউজারগুলি, সুপার অপ্টিমাইজড জেআইটি জাভাস্ক্রিপ্ট সংকলক, মাল্টি-কোর (†) মেশিন, টন মেমরি নিয়ে, আপনি কীসের ভয় পাচ্ছেন? আরে, জাভাস্ক্রিপ্টে জাভা শব্দ আছে, তাই এর পারফরম্যান্সের গ্যারান্টি দেওয়া উচিত, তাই না? দেখুন, থাম্বনেইল তৈরির কোড:

// returns a function that calculates lanczos weight
function lanczosCreate(lobes) {
    return function(x) {
        if (x > lobes)
            return 0;
        x *= Math.PI;
        if (Math.abs(x) < 1e-16)
            return 1;
        var xx = x / lobes;
        return Math.sin(x) * Math.sin(xx) / x / xx;
    };
}

// elem: canvas element, img: image element, sx: scaled width, lobes: kernel radius
function thumbnailer(elem, img, sx, lobes) {
    this.canvas = elem;
    elem.width = img.width;
    elem.height = img.height;
    elem.style.display = "none";
    this.ctx = elem.getContext("2d");
    this.ctx.drawImage(img, 0, 0);
    this.img = img;
    this.src = this.ctx.getImageData(0, 0, img.width, img.height);
    this.dest = {
        width : sx,
        height : Math.round(img.height * sx / img.width),
    };
    this.dest.data = new Array(this.dest.width * this.dest.height * 3);
    this.lanczos = lanczosCreate(lobes);
    this.ratio = img.width / sx;
    this.rcp_ratio = 2 / this.ratio;
    this.range2 = Math.ceil(this.ratio * lobes / 2);
    this.cacheLanc = {};
    this.center = {};
    this.icenter = {};
    setTimeout(this.process1, 0, this, 0);
}

thumbnailer.prototype.process1 = function(self, u) {
    self.center.x = (u + 0.5) * self.ratio;
    self.icenter.x = Math.floor(self.center.x);
    for (var v = 0; v < self.dest.height; v++) {
        self.center.y = (v + 0.5) * self.ratio;
        self.icenter.y = Math.floor(self.center.y);
        var a, r, g, b;
        a = r = g = b = 0;
        for (var i = self.icenter.x - self.range2; i <= self.icenter.x + self.range2; i++) {
            if (i < 0 || i >= self.src.width)
                continue;
            var f_x = Math.floor(1000 * Math.abs(i - self.center.x));
            if (!self.cacheLanc[f_x])
                self.cacheLanc[f_x] = {};
            for (var j = self.icenter.y - self.range2; j <= self.icenter.y + self.range2; j++) {
                if (j < 0 || j >= self.src.height)
                    continue;
                var f_y = Math.floor(1000 * Math.abs(j - self.center.y));
                if (self.cacheLanc[f_x][f_y] == undefined)
                    self.cacheLanc[f_x][f_y] = self.lanczos(Math.sqrt(Math.pow(f_x * self.rcp_ratio, 2)
                            + Math.pow(f_y * self.rcp_ratio, 2)) / 1000);
                weight = self.cacheLanc[f_x][f_y];
                if (weight > 0) {
                    var idx = (j * self.src.width + i) * 4;
                    a += weight;
                    r += weight * self.src.data[idx];
                    g += weight * self.src.data[idx + 1];
                    b += weight * self.src.data[idx + 2];
                }
            }
        }
        var idx = (v * self.dest.width + u) * 3;
        self.dest.data[idx] = r / a;
        self.dest.data[idx + 1] = g / a;
        self.dest.data[idx + 2] = b / a;
    }

    if (++u < self.dest.width)
        setTimeout(self.process1, 0, self, u);
    else
        setTimeout(self.process2, 0, self);
};
thumbnailer.prototype.process2 = function(self) {
    self.canvas.width = self.dest.width;
    self.canvas.height = self.dest.height;
    self.ctx.drawImage(self.img, 0, 0, self.dest.width, self.dest.height);
    self.src = self.ctx.getImageData(0, 0, self.dest.width, self.dest.height);
    var idx, idx2;
    for (var i = 0; i < self.dest.width; i++) {
        for (var j = 0; j < self.dest.height; j++) {
            idx = (j * self.dest.width + i) * 3;
            idx2 = (j * self.dest.width + i) * 4;
            self.src.data[idx2] = self.dest.data[idx];
            self.src.data[idx2 + 1] = self.dest.data[idx + 1];
            self.src.data[idx2 + 2] = self.dest.data[idx + 2];
        }
    }
    self.ctx.putImageData(self.src, 0, 0);
    self.canvas.style.display = "block";
};

... যার সাহায্যে আপনি এই জাতীয় ফলাফল তৈরি করতে পারেন!

img717.imageshack.us/img717/8910/lanczos358.png

যাইহোক, এখানে আপনার উদাহরণের একটি 'স্থির' সংস্করণ রয়েছে:

img.onload = function() {
    var canvas = document.createElement("canvas");
    new thumbnailer(canvas, img, 188, 3); //this produces lanczos3
    // but feel free to raise it up to 8. Your client will appreciate
    // that the program makes full use of his machine.
    document.body.appendChild(canvas);
};

এখন সময়টি আপনার সেরা ব্রাউজারগুলিকে খোলার এবং দেখার জন্য কোনটি সম্ভবত আপনার ক্লায়েন্টের রক্তচাপ বাড়িয়ে তুলবে!

উম্মে, আমার বিদ্রূপের ট্যাগটি কোথায়?

(যেহেতু কোডের অনেকগুলি অংশ অ্যানিরিফ গ্যালারী জেনারেটরের উপর ভিত্তি করে এটিও জিপিএল 2 এর আওতায় আসে? আমি জানি না)

J আসলে জাভাস্ক্রিপ্টের সীমাবদ্ধতার কারণে, বহু-কোর সমর্থিত নয়।


2
আমি নিজে এটি বাস্তবায়নের চেষ্টা করেছি, আপনার মতো করে ওপেন সোর্স চিত্র সম্পাদক থেকে কোড অনুলিপি করেছিলাম। যেহেতু আমি অ্যালগরিদমের কোনও দৃ document় ডকুমেন্টেশন সন্ধান করতে পারিনি এটির অনুকূলিতকরণের জন্য আমার খুব কষ্ট হয়েছিল। শেষ অবধি, আমার ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ছড়িয়ে পড়ে (চিত্রটি পুনরায় আকার দিতে কয়েক সেকেন্ড সময় নিয়েছিল)। আমি যখন সুযোগ পাবো, আমি আপনার চেষ্টা করে দেখব এবং এটি কোনও দ্রুত কিনা। এবং আমি মনে করি ওয়েবকর্মীরা এখন মাল্টি-কোর জাভাস্ক্রিপ্টকে সম্ভব করে তোলে। আমি এটির গতি বাড়ানোর জন্য তাদের ব্যবহার করার চেষ্টা করতে যাচ্ছিলাম, তবে কীভাবে এটি একটি
বহু

3
দুঃখিত, ভুলে গেছি! আমি উত্তর সম্পাদনা করেছি। এটি যাইহোক দ্রুত হতে যাচ্ছে না, বিকুবিকটি দ্রুত হওয়া উচিত। আমি যে অ্যালগরিদমটি ব্যবহার করেছি তা উল্লেখ না করা সাধারণ 2-ওয়ে আকার পরিবর্তন নয় (যা লাইন দ্বারা রেখার, অনুভূমিক তারপর উল্লম্ব), তাই এটি খুব আস্তে আস্তে।
syockit

5
আপনি দুর্দান্ত এবং দুর্দান্ত টনের প্রাপ্য।
রক্লান

5
এটি শালীন ফলাফল উত্পন্ন করে তবে Chrome এর সর্বশেষ সংস্করণে 1.8 এমপি চিত্রের জন্য 7.4 সেকেন্ড সময় নেয় ...
এমপেন

2
এর মতো পদ্ধতিগুলি কীভাবে এত উচ্চ স্কোর পরিচালনা করে ?? দেখানো সমাধান বর্ণের তথ্য সঞ্চয় করতে ব্যবহৃত লগারিদমিক স্কেলের জন্য অ্যাকাউন্টে সম্পূর্ণ ব্যর্থ। 127,127,127 এর একটি আরজিবি 255, 255, 255 অর্ধেক না হয়ে এক চতুর্থাংশের উজ্জ্বলতা। সমাধানের ডাউন স্যাম্পলিংয়ের ফলে অন্ধকারের চিত্র আসে। লজ্জাজনকভাবে এটি বন্ধ রয়েছে কারণ ডাউনশপের খুব সহজ এবং দ্রুত পদ্ধতি রয়েছে যা ফটোশপের তুলনায় আরও ভাল ফলাফল দেয় (ওপি অবশ্যই পছন্দগুলি ভুল সেট করে থাকতে পারে) নমুনা দেয়
ব্লাইন্ডম্যান 67

37

জাভাস্ক্রিপ্ট সহ হার্মাইট ফিল্টার ব্যবহার করে দ্রুত চিত্রের আকার পরিবর্তন / পুনরায় নমুনার অ্যালগরিদম । সমর্থন স্বচ্ছতা, ভাল মানের দেয়। পূর্বরূপ:

এখানে চিত্র বর্ণনা লিখুন

আপডেট : সংস্করণ 2.0 গিটহাব (দ্রুত, ওয়েব কর্মী + স্থানান্তরযোগ্য বস্তু) এ যুক্ত হয়েছে। অবশেষে আমি এটি কাজ পেয়েছিলাম!

গিট: https://github.com/viliusle/Hermite-resize
ডেমো: http://viliusle.github.io/miniPaint/

/**
 * Hermite resize - fast image resize/resample using Hermite filter. 1 cpu version!
 * 
 * @param {HtmlElement} canvas
 * @param {int} width
 * @param {int} height
 * @param {boolean} resize_canvas if true, canvas will be resized. Optional.
 */
function resample_single(canvas, width, height, resize_canvas) {
    var width_source = canvas.width;
    var height_source = canvas.height;
    width = Math.round(width);
    height = Math.round(height);

    var ratio_w = width_source / width;
    var ratio_h = height_source / height;
    var ratio_w_half = Math.ceil(ratio_w / 2);
    var ratio_h_half = Math.ceil(ratio_h / 2);

    var ctx = canvas.getContext("2d");
    var img = ctx.getImageData(0, 0, width_source, height_source);
    var img2 = ctx.createImageData(width, height);
    var data = img.data;
    var data2 = img2.data;

    for (var j = 0; j < height; j++) {
        for (var i = 0; i < width; i++) {
            var x2 = (i + j * width) * 4;
            var weight = 0;
            var weights = 0;
            var weights_alpha = 0;
            var gx_r = 0;
            var gx_g = 0;
            var gx_b = 0;
            var gx_a = 0;
            var center_y = (j + 0.5) * ratio_h;
            var yy_start = Math.floor(j * ratio_h);
            var yy_stop = Math.ceil((j + 1) * ratio_h);
            for (var yy = yy_start; yy < yy_stop; yy++) {
                var dy = Math.abs(center_y - (yy + 0.5)) / ratio_h_half;
                var center_x = (i + 0.5) * ratio_w;
                var w0 = dy * dy; //pre-calc part of w
                var xx_start = Math.floor(i * ratio_w);
                var xx_stop = Math.ceil((i + 1) * ratio_w);
                for (var xx = xx_start; xx < xx_stop; xx++) {
                    var dx = Math.abs(center_x - (xx + 0.5)) / ratio_w_half;
                    var w = Math.sqrt(w0 + dx * dx);
                    if (w >= 1) {
                        //pixel too far
                        continue;
                    }
                    //hermite filter
                    weight = 2 * w * w * w - 3 * w * w + 1;
                    var pos_x = 4 * (xx + yy * width_source);
                    //alpha
                    gx_a += weight * data[pos_x + 3];
                    weights_alpha += weight;
                    //colors
                    if (data[pos_x + 3] < 255)
                        weight = weight * data[pos_x + 3] / 250;
                    gx_r += weight * data[pos_x];
                    gx_g += weight * data[pos_x + 1];
                    gx_b += weight * data[pos_x + 2];
                    weights += weight;
                }
            }
            data2[x2] = gx_r / weights;
            data2[x2 + 1] = gx_g / weights;
            data2[x2 + 2] = gx_b / weights;
            data2[x2 + 3] = gx_a / weights_alpha;
        }
    }
    //clear and resize canvas
    if (resize_canvas === true) {
        canvas.width = width;
        canvas.height = height;
    } else {
        ctx.clearRect(0, 0, width_source, height_source);
    }

    //draw
    ctx.putImageData(img2, 0, 0);
}

হতে পারে আপনি আপনার মিনিপেইন্ট ডেমো এবং গিথুব রেপোতে লিঙ্কগুলি অন্তর্ভুক্ত করতে পারেন?
syockit

1
আপনি কি ওয়েব ওয়ার্কার্স সংস্করণটিও ভাগ করে নেবেন? সম্ভবত ওভারহেড সেটআপের কারণে, এটি ছোট চিত্রগুলির জন্য ধীর, তবে এটি বৃহত্তর উত্স চিত্রগুলির জন্য কার্যকর হতে পারে।
syockit

ডেমো, গিট লিঙ্কগুলি এবং মাল্টি-কোর সংস্করণ যুক্ত হয়েছে। বিটিডব্লু মাল্টিকোর সংস্করণ অনুকূলকরণে আমি খুব বেশি সময় ব্যয় করি নি ... আমি বিশ্বাস করি যে একক সংস্করণটি ভালভাবে অপ্টিমাইজড।
ভিলিয়াসএল

বিশাল পার্থক্য এবং শালীন কর্মক্ষমতা। আপনাকে অনেক ধন্যবাদ! এর আগে এবং পরে
কেভবার্নস জুন

2
@ ভিলিয়াসএল আহ এখন আমার মনে আছে কেন ওয়েব কর্মীরা এত ভাল কাজ করে না। তারা এর আগে মেমরি ভাগ করে নি, এবং এখনও নেই! সম্ভবত কোনও দিন যখন তারা এটিকে বাছাইয়ের ব্যবস্থা করেন, তখন আপনার কোডটি ব্যবহার করতে আসবে (যে, বা এর পরিবর্তে লোকেরা
পিএনএসিএল

26

ব্যবহার করে দেখুন Pica নির্বাচনযোগ্য algorythms সঙ্গে একটি অত্যন্ত অপ্টিমাইজ resizer যে -। ডেমো দেখুন

উদাহরণস্বরূপ, প্রথম পোস্টের আসল চিত্রটি 120 মিমি ল্যানকোস ফিল্টার এবং 3 পিক্স উইন্ডো বা 60 ফিল্ম এবং বক্স ফিল্টার এবং 0.5 টিপিএক্স উইন্ডো সহ আকার পরিবর্তন করা হয়। বিশাল 17 এমবি চিত্রের জন্য 5000x3000px আকার পরিবর্তন করতে ডেস্কটপে 1 ডলার এবং মোবাইলে 3s লাগে।

সমস্ত আকার পরিবর্তনের নীতিগুলি এই থ্রেডটিতে খুব ভালভাবে বর্ণিত হয়েছিল এবং পিকা রকেট বিজ্ঞান যুক্ত করে না। তবে এটি আধুনিক জেআইটি-এস-এর জন্য খুব ভালভাবে অনুকূলিত হয়েছে, এবং বাক্সের বাইরে ব্যবহার করতে প্রস্তুত (এনপিএম বা বোভারের মাধ্যমে)। এছাড়াও, যখন ইন্টারফেস হিমশীতল এড়ানোর জন্য উপলব্ধ থাকে তখন এটি ওয়েব ওয়ার্কার্স ব্যবহার করে।

আমি শীঘ্রই আনসার্প মাস্ক সমর্থন যুক্ত করার পরিকল্পনা করছি, কারণ এটি ডাউনস্কেলের পরে খুব কার্যকর।


14

আমি জানি এটি একটি পুরানো থ্রেড তবে এটি নিজের মতো কিছু লোকের পক্ষে কার্যকর হতে পারে যে কয়েক মাস পরে প্রথমবারের মতো এই সমস্যাটি আঘাত করছে।

এখানে এমন কিছু কোড রয়েছে যা প্রতিবার আপনি চিত্রটি পুনরায় লোড করুন। আমি জানি এটি মোটেও অনুকূল নয়, তবে আমি ধারণার প্রমাণ হিসাবে এটি সরবরাহ করি provide

এছাড়াও, সাধারণ নির্বাচকদের জন্য jQuery ব্যবহারের জন্য দুঃখিত তবে আমি সিনট্যাক্সটিতে কেবল খুব স্বাচ্ছন্দ্য বোধ করছি।

$(document).on('ready', createImage);
$(window).on('resize', createImage);

var createImage = function(){
  var canvas = document.getElementById('myCanvas');
  canvas.width = window.innerWidth || $(window).width();
  canvas.height = window.innerHeight || $(window).height();
  var ctx = canvas.getContext('2d');
  img = new Image();
  img.addEventListener('load', function () {
    ctx.drawImage(this, 0, 0, w, h);
  });
  img.src = 'http://www.ruinvalor.com/Telanor/images/original.jpg';
};
html, body{
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
  background: #000;
}
canvas{
  position: absolute;
  left: 0;
  top: 0;
  z-index: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Canvas Resize</title>
  </head>
  <body>
    <canvas id="myCanvas"></canvas>
  </body>
</html>

ডকুমেন্টটি লোড হয়ে গেলে আমার ক্রিয়েইমেজ ফাংশনটি একবার কল করা হয় এবং এর পরে যখনই উইন্ডোটি পুনরায় আকার দেওয়ার ইভেন্টটি গ্রহণ করা হয় তখনই ডাকা হয়।

আমি ম্যাক উভয়ই ক্রোম 6 এবং ফায়ারফক্স 3.6 এ এটি পরীক্ষা করেছি। এই "কৌশল" প্রসেসরটিকে গ্রীষ্মে আইসক্রিমের মতো খায় তবে এটি কৌশলটি কার্যকর করে।


9

এইচটিএমএল ক্যানভাস পিক্সেল অ্যারেতে ইমেজ ইন্টারপোলেশন করতে আমি কিছু অ্যালগরিদম রেখেছি যা এখানে দরকারী হতে পারে:

https://web.archive.org/web/20170104190425/http://jsperf.com:80/pixel-interpolation/2

এগুলি অনুলিপি / আটকানো হতে পারে এবং ওয়েব কর্মীদের ভিতরে চিত্রগুলির আকার পরিবর্তন করতে ব্যবহার করা যেতে পারে (বা অন্য কোনও ক্রিয়াকলাপ যা অন্তরঙ্গকরণ প্রয়োজন - আমি এই মুহুর্তে চিত্রগুলি অপদস্থ করতে তাদের ব্যবহার করছি)।

আমি উপরের ল্যাঙ্কজোস জিনিসগুলি যোগ করি নি, তাই আপনি চাইলে তুলনা হিসাবে এটিকে নির্দ্বিধায় যোগ করুন।


6

এটি @ টেলানরের কোড থেকে গৃহীত একটি জাভাস্ক্রিপ্ট ফাংশন। কোনও ফাংশনের প্রথম আর্গুমেন্ট হিসাবে কোনও ইমেজ বেস 64 কে পাশ করার সময়, এটি পুনরায় আকারিত চিত্রের বেস 64 প্রদান করে। ম্যাক্সউইথ এবং ম্যাক্সহাইট alচ্ছিক।

function thumbnail(base64, maxWidth, maxHeight) {

  // Max size for thumbnail
  if(typeof(maxWidth) === 'undefined') var maxWidth = 500;
  if(typeof(maxHeight) === 'undefined') var maxHeight = 500;

  // Create and initialize two canvas
  var canvas = document.createElement("canvas");
  var ctx = canvas.getContext("2d");
  var canvasCopy = document.createElement("canvas");
  var copyContext = canvasCopy.getContext("2d");

  // Create original image
  var img = new Image();
  img.src = base64;

  // Determine new ratio based on max size
  var ratio = 1;
  if(img.width > maxWidth)
    ratio = maxWidth / img.width;
  else if(img.height > maxHeight)
    ratio = maxHeight / img.height;

  // Draw original image in second canvas
  canvasCopy.width = img.width;
  canvasCopy.height = img.height;
  copyContext.drawImage(img, 0, 0);

  // Copy and resize second canvas to first canvas
  canvas.width = img.width * ratio;
  canvas.height = img.height * ratio;
  ctx.drawImage(canvasCopy, 0, 0, canvasCopy.width, canvasCopy.height, 0, 0, canvas.width, canvas.height);

  return canvas.toDataURL();

}

আপনার পদক্ষেপ খুব দ্রুত কিন্তু এটা হিসাবে আপনি এখানে দেখতে পারেন একটি ঝাপসা ইমেজ উত্পাদন করে: stackoverflow.com/questions/18922880/...
confile

6

আমি আপনাকে এই লিঙ্কটি চেক আউট করার পরামর্শ দিচ্ছি এবং এটি সত্য হয়ে গেছে কিনা তা নিশ্চিত করব।

চিত্র স্কেলিং আচরণ নিয়ন্ত্রণ করে

গেকো ১.৯.২ (ফায়ারফক্স ৩. / / থান্ডারবার্ড ৩.১ / ফেনেক ০.০) এ পরিচয় করিয়ে দেওয়া হয়েছে

গেকো ১.৯.২ মোজ ইমেজসমোটিংএইনেবলড প্রোপার্টিটি ক্যানভাস উপাদানটিতে প্রবর্তন করেছে; যদি এই বুলিয়ান মানটি মিথ্যা হয় তবে মাপার সময় চিত্রগুলি ধীমান করা হবে না। এই সম্পত্তিটি ডিফল্টরূপে সত্য। প্লেইনপ্রিন্ট দেখুন?

  1. cx.mozImageSmoomingEn اهل = মিথ্যা;

5

আপনি যদি কেবল কোনও চিত্রের আকার পরিবর্তন করতে চেষ্টা করেন তবে আমি সিএসএস সহ চিত্রটি সেটিং widthএবং সেট করার পরামর্শ দেব height। এখানে একটি দ্রুত উদাহরণ:

.small-image {
    width: 100px;
    height: 100px;
}

নোট করুন heightএবং widthজাভাস্ক্রিপ্ট ব্যবহার করে সেটও করা যেতে পারে। এখানে দ্রুত কোড নমুনা:

var img = document.getElement("my-image");
img.style.width = 100 + "px";  // Make sure you add the "px" to the end,
img.style.height = 100 + "px"; // otherwise you'll confuse IE

এছাড়াও, পুনরায় আকারিত চিত্রটি দেখতে সুন্দর দেখতে নিশ্চিত করতে, চিত্র সিলেক্টারে নিম্নলিখিত সিএসএস বিধিগুলি যুক্ত করুন:

যতদূর আমি বলতে পারি, আইই ব্যতীত সমস্ত ব্রাউজারগুলি ডিফল্টরূপে চিত্রগুলি পুনরায় আকার দেওয়ার জন্য একটি বিকিউবিক অ্যালগরিদম ব্যবহার করে, তাই আপনার পুনরায় আকারিত চিত্রগুলি ফায়ারফক্স এবং ক্রোমে ভাল দেখাচ্ছে।

যদি সিএসএস সেট করে widthএবং heightকাজ না করে তবে আপনি সিএসএস নিয়ে খেলতে চাইতে পারেন transform:

যদি আপনার কোনও ক্যানভাস ব্যবহার করার প্রয়োজন হয় তবে দয়া করে নোট করুন যে কোনও চিত্রের আকার পরিবর্তন করতে পারে এমন দুটি উপায় রয়েছে: ক্যানভাসকে সিএসএসের সাহায্যে আকার পরিবর্তন করে বা ছোট আকারে চিত্র অঙ্কন করে।

আরও তথ্যের জন্য এই প্রশ্নটি দেখুন ।


5
ক্যানভাসের আকার পরিবর্তন না করে বা ছোট আকারে ছবি আঁকানো দু: খজনকভাবে সমস্যাটি সমাধান করে না (ক্রোমে)।
নেস্টার

1
ক্রোম 27 দুর্দান্ত আকারিত আকারের চিত্র উত্পন্ন করে, তবে আপনি ফলাফলটি ক্যানভাসে অনুলিপি করতে পারবেন না; এটি করার চেষ্টা করা পরিবর্তে মূল চিত্রটি অনুলিপি করবে।
syockit

4

প্রস্থের চেয়ে কম মূলের সাথে চিত্রটির আকার পরিবর্তন করার জন্য, আমি ব্যবহার করি:

    function resize2(i) {
      var cc = document.createElement("canvas");
      cc.width = i.width / 2;
      cc.height = i.height / 2;
      var ctx = cc.getContext("2d");
      ctx.drawImage(i, 0, 0, cc.width, cc.height);
      return cc;
    }
    var cc = img;
    while (cc.width > 64 * 2) {
      cc = resize2(cc);
    }
    // .. than drawImage(cc, .... )

এবং এটি কাজ করে =)।


4

ফায়ারফক্সে ক্যানভাস উপাদানটি ডান ক্লিক করে এবং হিসাবে সংরক্ষণ করে আমি এই চিত্রটি পেয়েছি।

বিকল্প পাঠ

var img = new Image();
img.onload = function () {
    console.debug(this.width,this.height);
    var canvas = document.createElement('canvas'), ctx;
    canvas.width = 188;
    canvas.height = 150;
    document.body.appendChild(canvas);
    ctx = canvas.getContext('2d');
    ctx.drawImage(img,0,0,188,150);
};
img.src = 'original.jpg';

যাইহোক, এখানে আপনার উদাহরণের একটি 'স্থির' সংস্করণ রয়েছে:

var img = new Image();
// added cause it wasnt defined
var canvas = document.createElement("canvas");
document.body.appendChild(canvas);

var ctx = canvas.getContext("2d");
var canvasCopy = document.createElement("canvas");
// adding it to the body

document.body.appendChild(canvasCopy);

var copyContext = canvasCopy.getContext("2d");

img.onload = function()
{
        var ratio = 1;

        // defining cause it wasnt
        var maxWidth = 188,
            maxHeight = 150;

        if(img.width > maxWidth)
                ratio = maxWidth / img.width;
        else if(img.height > maxHeight)
                ratio = maxHeight / img.height;

        canvasCopy.width = img.width;
        canvasCopy.height = img.height;
        copyContext.drawImage(img, 0, 0);

        canvas.width = img.width * ratio;
        canvas.height = img.height * ratio;
        // the line to change
        // ctx.drawImage(canvasCopy, 0, 0, canvasCopy.width, canvasCopy.height, 0, 0, canvas.width, canvas.height);
        // the method signature you are using is for slicing
        ctx.drawImage(canvasCopy, 0, 0, canvas.width, canvas.height);
};

// changed for example
img.src = 'original.jpg';

আপনি যা করেছেন তা করার চেষ্টা করেছি এবং এটি আপনার মতো সুন্দর বের হচ্ছে না। আমি যদি কিছু মিস না করি তবে আপনি কেবলমাত্র পরিবর্তনটিই কেটে দেওয়ার পরিবর্তে স্কেলিং পদ্ধতির স্বাক্ষর ব্যবহার করেছিলেন, তাই না? কিছু কারণে এটি আমার পক্ষে কাজ করছে না।
টেলানোর

3

এই কয়েকটি সমাধানের সাথে সমস্যাটি হ'ল তারা সরাসরি পিক্সেল ডেটা অ্যাক্সেস করে ডাউনস্যাম্পলিং সম্পাদনের জন্য এর মাধ্যমে লুপ করে। চিত্রের আকারের উপর নির্ভর করে এটি খুব সংস্থানীয় সংস্থান হতে পারে এবং ব্রাউজারের অভ্যন্তরীণ অ্যালগরিদমগুলি ব্যবহার করা ভাল।

DrawImage () ফাংশন একটি রৈখিক-ক্ষেপক ব্যবহার করছে, সবচেয়ে কাছের-প্রতিবেশী পদ্ধতি রীস্যাম্পেলিং। আপনি যখন মূল আকারের অর্ধেকেরও বেশি আকার পরিবর্তন করছেন না তখন এটি ভাল কাজ করে

আপনি যদি একবারে সর্বাধিক অর্ধেকের আকার পরিবর্তন করতে লুপ করেন তবে ফলাফলগুলি বেশ ভাল এবং পিক্সেল ডেটা অ্যাক্সেস করার চেয়ে অনেক দ্রুত হবে।

পছন্দসই আকারে পৌঁছানো পর্যন্ত এই ফাংশনটি একবারে অর্ধেক করে রাখুন:

  function resize_image( src, dst, type, quality ) {
     var tmp = new Image(),
         canvas, context, cW, cH;

     type = type || 'image/jpeg';
     quality = quality || 0.92;

     cW = src.naturalWidth;
     cH = src.naturalHeight;

     tmp.src = src.src;
     tmp.onload = function() {

        canvas = document.createElement( 'canvas' );

        cW /= 2;
        cH /= 2;

        if ( cW < src.width ) cW = src.width;
        if ( cH < src.height ) cH = src.height;

        canvas.width = cW;
        canvas.height = cH;
        context = canvas.getContext( '2d' );
        context.drawImage( tmp, 0, 0, cW, cH );

        dst.src = canvas.toDataURL( type, quality );

        if ( cW <= src.width || cH <= src.height )
           return;

        tmp.src = dst.src;
     }

  }
  // The images sent as parameters can be in the DOM or be image objects
  resize_image( $( '#original' )[0], $( '#smaller' )[0] );

এই পোস্টে ক্রেডিট


2

ক্যানভাসের সাথে কাজ করার সময় আমি আকর্ষণীয় কিছু খুঁজে পেয়েছি যা সহায়ক হতে পারে:

তার নিজের উপর ক্যানভাস নিয়ন্ত্রণ মাপ পরিবর্তন করার জন্য, আপনাকে ব্যবহার করতে হবে height=""এবং width=""বৈশিষ্ট্যাবলী (অথবা canvas.width/canvas.height উপাদান)। আপনি যদি ক্যানভাসের আকার পরিবর্তন করতে সিএসএস ব্যবহার করেন তবে এটি সম্পূর্ণ ক্যানভাসের (কেবল ক্যানভাসের ক্ষেত্রটি বাড়ানো বা হ্রাস করার পরিবর্তে) ক্যানভাসের সামগ্রীটি প্রসারিত করবে (যেমন: পুনরায় আকার দিন)।

চিত্রটির আকারের সাথে উচ্চতা এবং প্রস্থের বৈশিষ্ট্যগুলি সেট করে ক্যানভাস নিয়ন্ত্রণে চিত্রটি আঁকতে এবং তারপরে ক্যানভাসকে যে আকারটি খুঁজছেন তার আকার পরিবর্তন করতে সিএসএস ব্যবহার করার চেষ্টা করা এক শটের মতো। সম্ভবত এটি একটি ভিন্ন আকার পরিবর্তনকারী অ্যালগরিদম ব্যবহার করবে।

এটিও লক্ষ করা উচিত যে বিভিন্ন ব্রাউজারগুলিতে ক্যানভাসের বিভিন্ন প্রভাব রয়েছে (এবং এমনকি বিভিন্ন ব্রাউজারের বিভিন্ন সংস্করণ)। ব্রাউজারগুলিতে ব্যবহৃত অ্যালগরিদম এবং কৌশলগুলি সময়ের সাথে সাথে পরিবর্তিত হতে পারে (বিশেষত ফায়ারফক্স 4 এবং ক্রোম 6 খুব শীঘ্রই প্রকাশিত হবে, যা ক্যানভাস রেন্ডারিং পারফরম্যান্সের উপর ভারী জোর দেবে)।

এছাড়াও, আপনি এসভিজিকেও একটি শট দিতে চাইতে পারেন কারণ এটি সম্ভবত একটি পৃথক অ্যালগরিদমও ব্যবহার করে।

শুভকামনা করছি!


1
এইচটিএমএল বৈশিষ্ট্যগুলির মাধ্যমে ক্যানভাসের প্রস্থ বা উচ্চতা নির্ধারণের ফলে ক্যানভাসটি সাফ হয়ে যায়, সুতরাং সেই পদ্ধতিটির সাথে কোনও আকার পরিবর্তন করা যায় না। এছাড়াও, এসভিজি গণিতের চিত্রগুলি নিয়ে কাজ করার জন্য। আমার পিএনজি এবং এগুলি আঁকতে সক্ষম হওয়া দরকার, যাতে আমাকে সেখানে সাহায্য করতে না পারে।
টেলানর

ক্যানভাসের উচ্চতা এবং প্রস্থ নির্ধারণ করা এবং CSS ব্যবহার করে পুনরায় আকার দেওয়ার সাহায্য করে না, আমি খুঁজে পেয়েছি (ক্রোমে)। এমনকি সিএসএস প্রস্থ / উচ্চতার চেয়ে -উইবকিট-ট্রান্সফর্ম ব্যবহার করে পুনরায় আকারটি করাও আন্তঃবিবর্তন পায় না।
নেস্টর

2

আমি লিখেছি যে মডিউলটি আমি লিখেছি তা ফটোশপের ক্ষেত্রেও একই রকম ফলাফল এনে দেবে, কারণ এটি রঙিন ডেটা গড় হিসাবে সংরক্ষণ করে, অ্যালগরিদম প্রয়োগ না করে। এটি ধীর ধরণের, তবে আমার কাছে এটি সবচেয়ে ভাল, কারণ এটি সমস্ত রঙের ডেটা সংরক্ষণ করে।

https://github.com/danschumann/limby-resize/blob/master/lib/canvas_resize.js

এটি নিকটতম প্রতিবেশী লাগে না এবং অন্যান্য পিক্সেল ফেলে না, বা একটি দলকে নমুনা দেয় এবং এলোমেলো গড় নেয়। প্রতিটি উত্স পিক্সেল গন্তব্য পিক্সেল আউটপুট করা উচিত সঠিক অনুপাত লাগে। উত্সের গড় পিক্সেল রঙ গন্তব্যস্থলের গড় পিক্সেল রঙ হবে, যা এই অন্যান্য সূত্রগুলি, আমি মনে করি সেগুলি হবে না।

কীভাবে ব্যবহার করবেন তার একটি উদাহরণ https://github.com/danschumann/limby-resize এর নীচে রয়েছে

হালনাগাদ অক্টোবর 2018 : আজকাল আমার উদাহরণটি অন্য যে কোনও কিছুর চেয়ে বেশি একাডেমিক। ওয়েবজিএল 100% অনেক বেশি, সুতরাং একইরকম ফলাফল তৈরি করার জন্য আপনি এর সাথে আকার পরিবর্তন করা আরও ভাল তবে দ্রুত। পিকা.জেএস এটি করে, আমি বিশ্বাস করি। -


1

আমি @ সাইকিতের উত্তরের পাশাপাশি স্টেপ-ডাউন পদ্ধতির যে কারও আগ্রহী তাদের পুনরায় ব্যবহারযোগ্য কৌণিক পরিষেবাতে রূপান্তরিত করেছি: https://gist.github.com/fisch0920/37bac5e741eaec60e983

আমি উভয় সমাধান অন্তর্ভুক্ত করেছি কারণ তাদের উভয়ের নিজস্ব উপকারিতা / বিপরীত রয়েছে। ধীরে ধীরে ধীরে ধীরে ল্যানকোজ কনভলিউশন পদ্ধতির উচ্চমানের হয়, তবে ধাপে ধাপে ডাউন স্কেলিং পদ্ধতির কারণে যুক্তিযুক্ত ফলস্বরূপ ফলাফল পাওয়া যায় এবং তা দ্রুততর হয়।

ব্যবহারের উদাহরণ:

angular.module('demo').controller('ExampleCtrl', function (imageService) {
  // EXAMPLE USAGE
  // NOTE: it's bad practice to access the DOM inside a controller, 
  // but this is just to show the example usage.

  // resize by lanczos-sinc filter
  imageService.resize($('#myimg')[0], 256, 256)
    .then(function (resizedImage) {
      // do something with resized image
    })

  // resize by stepping down image size in increments of 2x
  imageService.resizeStep($('#myimg')[0], 256, 256)
    .then(function (resizedImage) {
      // do something with resized image
    })
})

1

দ্রুত এবং সাধারণ জাভাস্ক্রিপ্ট চিত্রের পুনঃনির্ধারক:

https://github.com/calvintwr/blitz-hermite-resize

const blitz = Blitz.create()

/* Promise */
blitz({
    source: DOM Image/DOM Canvas/jQuery/DataURL/File,
    width: 400,
    height: 600
}).then(output => {
    // handle output
})catch(error => {
    // handle error
})

/* Await */
let resized = await blizt({...})

/* Old school callback */
const blitz = Blitz.create('callback')
blitz({...}, function(output) {
    // run your callback.
})

ইতিহাস

এটি সত্যই অনেক দফা গবেষণা, পড়া এবং চেষ্টা করার পরে।

রেজাইজার অ্যালগরিদম @ ভিলিউসএল এর হার্মাইট স্ক্রিপ্ট ব্যবহার করে (হার্মাইট রাইজারটি সত্যই দ্রুততম এবং যুক্তিসঙ্গতভাবে ভাল আউটপুট দেয়)। আপনার প্রয়োজনীয় বৈশিষ্ট্যগুলি সহ প্রসারিত।

1 জন কর্মীকে পুনরায় আকার দেওয়ার জন্য জোর দেয় যাতে পুনরায় আকার দেওয়ার সময় এটি আপনার ব্রাউজারকে হিমায়িত না করে, সেখানে থাকা অন্য সমস্ত জেএস পুনরায় পরিবর্তকের তুলনায়।


0

একটি দুর্দান্ত উত্তরের জন্য @ সাইকিতকে ধন্যবাদ। তবে এটিকে কাজ করার জন্য আমাকে নীচে কিছুটা পুনরায় ফর্ম্যাট করতে হয়েছিল। সম্ভবত ডিওএম স্ক্যানিং সম্পর্কিত সমস্যার কারণে:

$(document).ready(function () {

$('img').on("load", clickA);
function clickA() {
    var img = this;
    var canvas = document.createElement("canvas");
    new thumbnailer(canvas, img, 50, 3);
    document.body.appendChild(canvas);
}

function thumbnailer(elem, img, sx, lobes) {
    this.canvas = elem;
    elem.width = img.width;
    elem.height = img.height;
    elem.style.display = "none";
    this.ctx = elem.getContext("2d");
    this.ctx.drawImage(img, 0, 0);
    this.img = img;
    this.src = this.ctx.getImageData(0, 0, img.width, img.height);
    this.dest = {
        width: sx,
        height: Math.round(img.height * sx / img.width)
    };
    this.dest.data = new Array(this.dest.width * this.dest.height * 3);
    this.lanczos = lanczosCreate(lobes);
    this.ratio = img.width / sx;
    this.rcp_ratio = 2 / this.ratio;
    this.range2 = Math.ceil(this.ratio * lobes / 2);
    this.cacheLanc = {};
    this.center = {};
    this.icenter = {};
    setTimeout(process1, 0, this, 0);
}

//returns a function that calculates lanczos weight
function lanczosCreate(lobes) {
    return function (x) {
        if (x > lobes)
            return 0;
        x *= Math.PI;
        if (Math.abs(x) < 1e-16)
            return 1
        var xx = x / lobes;
        return Math.sin(x) * Math.sin(xx) / x / xx;
    }
}

process1 = function (self, u) {
    self.center.x = (u + 0.5) * self.ratio;
    self.icenter.x = Math.floor(self.center.x);
    for (var v = 0; v < self.dest.height; v++) {
        self.center.y = (v + 0.5) * self.ratio;
        self.icenter.y = Math.floor(self.center.y);
        var a, r, g, b;
        a = r = g = b = 0;
        for (var i = self.icenter.x - self.range2; i <= self.icenter.x + self.range2; i++) {
            if (i < 0 || i >= self.src.width)
                continue;
            var f_x = Math.floor(1000 * Math.abs(i - self.center.x));
            if (!self.cacheLanc[f_x])
                self.cacheLanc[f_x] = {};
            for (var j = self.icenter.y - self.range2; j <= self.icenter.y + self.range2; j++) {
                if (j < 0 || j >= self.src.height)
                    continue;
                var f_y = Math.floor(1000 * Math.abs(j - self.center.y));
                if (self.cacheLanc[f_x][f_y] == undefined)
                    self.cacheLanc[f_x][f_y] = self.lanczos(Math.sqrt(Math.pow(f_x * self.rcp_ratio, 2) + Math.pow(f_y * self.rcp_ratio, 2)) / 1000);
                weight = self.cacheLanc[f_x][f_y];
                if (weight > 0) {
                    var idx = (j * self.src.width + i) * 4;
                    a += weight;
                    r += weight * self.src.data[idx];
                    g += weight * self.src.data[idx + 1];
                    b += weight * self.src.data[idx + 2];
                }
            }
        }
        var idx = (v * self.dest.width + u) * 3;
        self.dest.data[idx] = r / a;
        self.dest.data[idx + 1] = g / a;
        self.dest.data[idx + 2] = b / a;
    }

    if (++u < self.dest.width)
        setTimeout(process1, 0, self, u);
    else
        setTimeout(process2, 0, self);
};

process2 = function (self) {
    self.canvas.width = self.dest.width;
    self.canvas.height = self.dest.height;
    self.ctx.drawImage(self.img, 0, 0);
    self.src = self.ctx.getImageData(0, 0, self.dest.width, self.dest.height);
    var idx, idx2;
    for (var i = 0; i < self.dest.width; i++) {
        for (var j = 0; j < self.dest.height; j++) {
            idx = (j * self.dest.width + i) * 3;
            idx2 = (j * self.dest.width + i) * 4;
            self.src.data[idx2] = self.dest.data[idx];
            self.src.data[idx2 + 1] = self.dest.data[idx + 1];
            self.src.data[idx2 + 2] = self.dest.data[idx + 2];
        }
    }
    self.ctx.putImageData(self.src, 0, 0);
    self.canvas.style.display = "block";
}
});

-1

আমি পাশের সাথে তুলনা করে কেবল একটি পৃষ্ঠায় দৌড়েছি এবং যদি সম্প্রতি কিছু পরিবর্তন না হয় আমি ক্যানভাস বনাম সহজ সিএসএস ব্যবহার করে এর চেয়ে ভালতর আকার (স্কেলিং) দেখতে পাই না। আমি এফএফ 6 ম্যাক ওএসএক্স 10.7 এ পরীক্ষা করেছি। এখনও সামান্য নরম বনাম মূল।

তবে আমি এমন কোনও কিছুর প্রতি হোঁচট খেয়েছি যা একটি বিশাল পার্থক্য করেছে এবং এটি ব্রাউজারগুলিতে ইমেজ ফিল্টার ব্যবহার করছে যা ক্যানভাস সমর্থন করে। ফটোশপে ব্লার, শার্পেন, স্যাচুরেশন, রিপল, গ্রেস্কেল ইত্যাদির সাহায্যে আপনি আসলে চিত্রগুলি হেরফের করতে পারেন

এরপরে আমি একটি দারুণ jQuery প্লাগ-ইন পেয়েছি যা এই ফিল্টারগুলিকে স্ন্যাপ দেয়: http://codecanyon.net/item/jsmanipulate-jquery-image-manipulation-plugin/428234

আমি সহজেই চিত্রটি পুনরায় আকার দেওয়ার পরে তীক্ষ্ণ ফিল্টারটি প্রয়োগ করি যা আপনাকে পছন্দসই প্রভাব দেয়। এমনকি আমাকে ক্যানভাস উপাদান ব্যবহার করতে হয়নি।


-1

আর একটি দুর্দান্ত সহজ সমাধান খুঁজছেন?

var img=document.createElement('img');
img.src=canvas.toDataURL();
$(img).css("background", backgroundColor);
$(img).width(settings.width);
$(img).height(settings.height);

এই সমাধানটি ব্রাউজারের পুনরায় আকারের অ্যালগরিদ ব্যবহার করবে! :)


প্রশ্নটি কেবল আকারটি পরিবর্তন করে নয়, চিত্রটি নিম্নচালিত করার বিষয়ে।
জেসেস ক্যারেরা

[...] আমি একটি জেপিজিকে পুনরায় আকার দেওয়ার চেষ্টা করছি। আমি লিঙ্কযুক্ত সাইটে এবং ফটোশপে একই জেপিজিকে পুনরায় আকার দেওয়ার চেষ্টা করেছি এবং যখন আকার ছোট করা হয় তখন তা দেখতে ভাল লাগে [[...] আপনি <img> যিশু কারেরাকে কেন ব্যবহার করতে পারবেন না?
ale500
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.