নোড.জেএস: ইমেজম্যাগিক ছাড়াই চিত্রের আকার পরিবর্তন করা


86

আমি নোড.জেএস (+ এক্সপ্রেস 4) এ একটি ওয়েব অ্যাপ বিকাশ করছি যেখানে ব্যবহারকারীরা তাদের প্রোফাইল চিত্রটি সার্ভারে আপলোড করে সেট করতে পারবেন। আমরা ইতিমধ্যে ফাইল মাইমটাইপ এবং সর্বাধিক ফাইলাইজিকে সীমাবদ্ধ করেছি, যাতে ব্যবহারকারী 200 কেবি পিএনজি বা জেপিগ চিত্রের বেশি আপলোড করতে পারে না।

সমস্যাটি হ'ল আমরা পৃষ্ঠাটি লোডিং এবং ডিস্কে স্থান সংরক্ষণের উন্নতি করতে আপলোড করা চিত্রের রেজোলিউশনটি 200x200 এ পুনরায় আকার দিতে (সার্ভারসাইড) করতে চাই। কিছু গবেষণার পরে, সমস্ত উত্তর ইমেজম্যাগিক বা গ্রাফিক্সম্যাগিকের উপর ভিত্তি করে কোনও মডিউল ব্যবহারের দিকে ইঙ্গিত করেছে।

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

সম্পাদনা: পূর্ববর্তী সমাধান (lwip) আর বজায় না থাকায় আমি গ্রহণযোগ্য সমাধানটিকে তীক্ষ্ণ পরিবর্তন করেছি । আপনার সমস্ত প্রতিক্রিয়ার জন্য ধন্যবাদ!


ওহে. আমি একটি প্রশ্ন আছে। কীভাবে 200KB এর নীচে চিত্রের আকার হ্রাস করবেন? দয়া করে, উপায় সম্পর্কে ব্যাখ্যা করুন। ধন্যবাদ
সি। পেট্রেস্কু

হ্যালো, যদি আপনি পূর্বে পোস্ট করা কোনও সম্পর্কিত কোনও সন্ধান না পান তবে প্রশ্নটি নতুন হিসাবে পোস্ট করা উপযুক্ত। আপনাকে কিছুটা আলোকপাত করার জন্য, এই প্রশ্নটিতে আপনি যে সরঞ্জামগুলি পেতে পারেন তার জন্য সরবরাহিত API তে সংক্ষেপ এবং পুনরায় আকার দেওয়ার পদ্ধতি অনুসন্ধান করার চেষ্টা করুন।
zacr0

উত্তর:


92

আমি ভোট দেবে ধারালো :

sharp('input.jpg')
  .resize(200, 200)
  .toFile('ouput.jpg', function(err) {
    // output.jpg is a 200 pixels wide and 200 pixels high image
    // containing a scaled and cropped version of input.jpg
  });

এটি দ্রুত, সাধারণত চিত্রযুক্ত ম্যাগিক-ভিত্তিক নোড বাইন্ডিংয়ের চেয়ে 6x দ্রুত এবং খুব কম স্মৃতিতে চালিত হয়, সম্ভবত 10x কমlibvips চিত্র লাইব্রেরির সরাসরি তাত্পর্যপূর্ণ লিঙ্কগুলি , কোনও বাহ্যিক প্রোগ্রামে কোনও শেলিং নেই, এবং লাইব্রেরি নিজেই এই কার্যটিতে * ম্যাজিকের চেয়ে দ্রুত এবং আরও দক্ষ। এটি স্ট্রিম, বাফার এবং ফাইল সিস্টেম ইনপুট এবং আউটপুট, রঙ পরিচালনা, স্বচ্ছতা, প্রতিশ্রুতি, ওভারলেস, ওয়েবপি, এসভিজি এবং আরও অনেকের মতো দরকারী জিনিসগুলিকে সমর্থন করে।

তীক্ষ্ণ 0.20 হিসাবে, এনপিএম বেশিরভাগ প্ল্যাটফর্মগুলিতে স্বয়ংক্রিয়ভাবে সম্পূর্ণ প্রাক-সংকলিত বাইনারিগুলি ডাউনলোড করবে, সুতরাং নোড-জিপের কোনও প্রয়োজন নেই। কেবল প্রবেশ করুন:

npm install sharp

বা:

yarn add sharp

এবং বন্ধ আপনি যান।


7
V0.12.0 হিসাবে, sharpলিনাক্স এবং উইন্ডোজ ব্যবহারকারীদের জন্য আর কোনও বহিরাগত রানটাইম নির্ভরতা নেই কারণ এটি libvips এর প্রাক-সংকলিত সংস্করণকে বান্ডিল করে। আপনি দেখতে পাবেন যে আকার পরিবর্তনকারী ক্রিয়াকলাপগুলি এলডাব্লুআইপি থেকে 10x ডলার এবং মেমরির ব্যবহারের একটি ভগ্নাংশের চেয়ে দ্রুত।
লাভল ফুলার

4
ধারালো দেশীয় GIF এবং সংস্করণ 0.15 সঙ্গে SVG সমর্থন যোগ করা sharp.dimens.io/en/stable/changelog
jcupitt

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

4
@ কোডেম্যানএক্স সম্ভবত npm install --global --production windows-build-toolsপ্রথম চালানোর চেষ্টা করুন । আরও দেখুন github.com/Mic Microsoft
ফুলার

4
আমি একটি ছোট স্ক্রিপ্ট তৈরি করেছি যাতে জিনিসগুলি কী করছে এবং এটি বুস্ট্র্যাপ কার্ড এবং ব্যাকগ্রাউন্ডের মতো সামগ্রীতে কীভাবে দেখাবে তা দেখতে সহজ করে তোলে : প্যারামগুলি
লরেন্স

71

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

আপনি যা জিজ্ঞাসা করছেন তা নিম্নলিখিত হিসাবে করা হবে:

image.resize(200, 200, function(err, image){
    // encode resized image to jpeg and get a Buffer object
    image.toBuffer('jpg', function(err, buffer){
        // save buffer to disk / send over network / etc.
    });
});

মডিউলটির গিথুব রেপোতে আরও তথ্য ।


7
আপনার মডিউল দুর্দান্ত। তবে এটি এত স্মৃতি লাগে। আমি writeFile একটি 1.8Mbচিত্র চেষ্টা করেছি এবং এর জন্য ১৩০ এমবি স্মৃতি দরকার। এর পরে, আমি 4MB, 11000x6000বেশ কয়েকটি থাম্বনেইলে একটি চিত্রের আকার পরিবর্তন করে একটি পরীক্ষা করি (640,560,480, ..., 160) এবং এতে প্রায় 1.7 গিগাবাইট মেমরি লাগে। এটা কি বাগ?
লুইস

4
হাই @ ওরিওন, মতামতের জন্য ধন্যবাদ দয়া করে গিথুব রেপোতে যান এবং আরও কিছু বিশদ (ওএস, সংস্করণ, এটি পুনরুত্পাদন করার কোড) সহ একটি সমস্যা খুলুন। আমরা একসাথে এটি সমাধান করার চেষ্টা করব :)
এয়ালআর

@ আইয়ালআর আরে হিয়াল, কীভাবে আকার পরিবর্তন করবেন এবং দিকটি কীভাবে রাখবেন? প্রসারিত ছাড়াই (সর্বোচ্চ প্রশস্ত আকারের উচ্চতা, উচ্চতার আকারে আকার দিন)
ড্যানিয়েল ক্রোম

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

9
দুর্ভাগ্যক্রমে lwip একটি মৃত প্রকল্প। তীক্ষ্ণ তবে এখনও সক্রিয়ভাবে বজায় রাখা হয়েছে বলে মনে হচ্ছে।
লরেন্ট

16

লুইপটি দেখুন: https://github.com/EyalAr/lwip

অত্যন্ত সহজ এবং ব্যবহার করা সহজ

npm install lwip

এবং তারপরে আপনার নোড কোডে,

// obtain an image object:
require('lwip').open('image.jpg', function(err, image){

  // check err...
  // define a batch of manipulations and save to disk as JPEG:
  image.batch()
    .scale(0.75)          // scale to 75%
    .rotate(45, 'white')  // rotate 45degs clockwise (white fill)
    .crop(200)            // crop a 200X200 square from center
    .blur(5)              // Gaussian blur with SD=5
    .writeFile('output.jpg', function(err){
      // check err...
      // done.
    });

});

আমি এটি সফলভাবে আমার ফাইল আপলোডারে প্রয়োগ করেছি এবং এটি একটি কবজির মতো কাজ করে।


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

4
বিটিডব্লিউ @ আইয়ালআর এই নোড মডিউলটির লেখক। তার মন্তব্যটি নীচেও তালিকাভুক্ত করা হয়েছে।
অরবিন্দ

ইনস্টল এবং সাথে কাজ করার জন্য খুব স্বজ্ঞাত। আমি সত্যিই পছন্দ করি যে আপনার কোনও ইমেজম্যাগিকের মতো বাইনারি লাইব্রেরি প্রয়োগ করার দরকার নেই।
ক্রিসরিচ

যে এই উত্তর (lwip মালিক) হিসাবে ঠিক একই, কিন্তু পরে: stackoverflow.com/a/24543924/1525495
হোর্হে ফুয়েন্তেস গোনজালেজ

12

অন্য কোনও লাইব্রেরি, জিম্পের উপর নির্ভরতা ছাড়াই পুরোপুরি জাভাস্ক্রিপ্টে লেখা একটি ভাল চিত্রের ম্যানিপুলেশন লাইব্রেরি রয়েছে। https://github.com/oliver-moran/jimp

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

var Jimp = require("jimp");

// open a file called "lenna.png"
Jimp.read("lenna.png", function (err, lenna) {
    if (err) throw err;
    lenna.resize(256, 256)            // resize
         .quality(60)                 // set JPEG quality
         .write("lena-small.jpg"); // save
});

ইমেজম্যাগিকের তুলনায় এটি কতটা দ্রুত?
ক্রিস্টোফার গ্রিগ

4
ধারালো একটি মানদণ্ডের সেট রয়েছে: ধারালো.ডিমেনস.আইও / এএন / স্টেবল / পারফরম্যান্স --- সেই পরীক্ষায়, জিম্প আইএম এর চেয়ে 5x ধীর এবং ধারালো থেকে 30x ধীর হয়। অবশ্যই, দ্রুত যথেষ্ট দ্রুত যথেষ্ট, এবং গতি কেবল বিবেচনা করার কারণ নয়।
jcupitt

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

জিম্প ওয়েবপ সমর্থন করে না এবং নিকটতম ভবিষ্যতে সমর্থন করবে না। : দেখুন github.com/oliver-moran/jimp/issues/144
Viacheslav Dobromyslov

8

ধারালো সম্প্রতি কিছু জনপ্রিয়তা উপভোগ করেছে, তবে এটি * ম্যাগিক বাইন্ডিংয়ের মতো একই ধারণা।

তবে, একটি সাধারণ চিত্র পুনরায় আকার দেওয়ার জন্য ইমেজম্যাগিক / গ্রাফিক্স ম্যাজিক ইনস্টল করা আমার পক্ষে খুব বেশি ওভারকিল বলে মনে হচ্ছে

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


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

7

ইমেজম্যাগিকের চেয়ে ক্যানভাসটি ২.৩ গুণ বেশি দ্রুত

আপনি ইমেজ ম্যানিপুলেশনের জন্য নোড.জেএস মডিউলগুলি তুলনা করার চেষ্টা করতে পারেন - https://github.com/ivanoff/images-manipulation-performance

author's results:
 sharp.js : 9.501 img/sec; minFreeMem: 929Mb
 canvas.js : 8.246 img/sec; minFreeMem: 578Mb
 gm.js : 4.433 img/sec; minFreeMem: 791Mb
 gm-imagemagic.js : 3.654 img/sec; minFreeMem: 804Mb
 lwip.js : 1.203 img/sec; minFreeMem: 54Mb
 jimp.js : 0.445 img/sec; minFreeMem: 82Mb

3

আপনার যদি কোনও বড় চিত্রের প্রয়োজন না হয় তবে আপনি এটি আপলোড করার আগে ক্লায়েন্টের পক্ষেই এটি আকার পরিবর্তন করতে পারেন:

ফাইল এপিআই ব্যবহার করে জাভাস্ক্রিপ্টে ফাইল পড়া

সার্ভারে আপলোড করার আগে জাভাস্ক্রিপ্ট সহ চিত্রের পুনরায় আকার দেওয়া ক্লায়েন্ট-সাইড

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


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

1

আমি লুইপ ব্যবহার করছিলাম (যেমনটি আগে আর্কাইন্ডের পরামর্শ দিয়েছিল) তবে পিএনজি -ফসলে স্যুইচ করা হয়েছে । মনে হচ্ছে এটি আমার জন্য কিছুটা দ্রুত কাজ করবে (উইন 8.1 x64, নোড v0.12.7)। রেপোতে কোডটি অবিশ্বাস্যরকম হালকা ওজনের দেখায় এবং কার্যত এটি ব্যবহার করা সহজ।

var pngcrop = require('png-crop');
var config = {left: 10, top: 100, height: 150, width: 150};
pngcrop.crop('cats.png','cats-cropped.png',config);

অবশ্যই, এটি কেবল পিএনজি ফাইল করবে ...


0

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

আপনাকে লিখিত চিত্রের দিকে মনোযোগ দিতে হবে, আপনি যদি "/" দিয়ে পথ শুরু করেন তবে এটি আপনাকে কিছু ত্রুটি দিতে পারে।

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

const imageUrl = `SOME_URL`;
let imgExported = 'EXPORTED_PIC.png';

Jimp.read(imageUrl)
    .then(image => {
        image   
            .resize(X, Y) 
            .write(`tmp/`+ imgExported, err => { 
                if(err) 
                    console.error('Write error: ', err);
                else { ... // don't forget to put a callback() } }

            });

মৃত্যুদন্ডের আদেশের জন্যও নজর রাখুন, কলব্যাক দিন যাতে আপনি যখন চান না তখন অন্যান্য জিনিস না ঘটে। জিম্প্রেড () এর জন্য "অপেক্ষা" ব্যবহার করার চেষ্টা করা হয়েছে তবে এটি কাজটি ভাল করে না।


তীক্ষ্ণ 0.20 থেকে, এটি বেশিরভাগ প্ল্যাটফর্মগুলিতে আপনার সঠিক নোড সংস্করণটির জন্য স্বয়ংক্রিয়ভাবে একটি প্রাক-সংকলিত বাইনারি ডাউনলোড করবে, সুতরাং কিছু নির্মাণের প্রয়োজন নেই।
jcupitt

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

0

আপনি জিম্প (নোড_মডিউল) ব্যবহার করে এটি করতে পারেন

স্থানীয় লিখুন:

Jimp.read(path) // this can be url or local location
      .then(image=> {
          image
            .resize(size, Jimp.AUTO) // jimp.AUTO automatically sets the width so that the image doesnot looks odd
            .write('path-to-save');
      })
      .catch(err => {
        console.log(err);
      });

এস 3 এ আপলোড করতে বা যেখানে আপনার পছন্দ হয়।

Jimp.read(urls) // this can be url or local location
          .then(image=> {
              image
                .resize(size, Jimp.AUTO) // jimp.AUTO automatically sets the width so that the image doesnot looks odd
                .getBase64(Jimp.AUTO, (err, res) => {
                  const buf = new Buffer(
                    res.replace(/^data:image\/\w+;base64,/, ""),
                    "base64"
                  );
                  var data = {
                    Key: key,
                    Bucket: bucket,
                    Body: body,
                    ContentEncoding: "base64",
                    ContentType: "image/jpeg"
                  };
                  s3.putObject(data, function(err, data) {
                    if (err) {
                      throw err;
                    } else {
                      console.log("succesfully uploaded the image!");
                    }
                  });
                });
          })
          .catch(err => {
            console.log(err);
          });

0

আমি এর সরলতার জন্য পুনরায় আকার-img লাইব্রেরি পছন্দ করি ।

const fs = require('fs');
const resizeImg = require('resize-img');

(async () => {
    const image = fs.readFileSync('unicorn.png');

    const newImage = await resizeImg(image, { width: 128, height: 128 });

    fs.writeFileSync('unicorn-128x128.png', newImage);
})();

0

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

অ্যালগরিদম:

  1. আপলোড করুনগুগল ড্রাইভ ফোল্ডারে চিত্র ।
  2. পাওয়াচিত্রের থাম্বনেইল সর্বজনীন URL ।
  3. প্রয়োজনীয় প্রস্থ এবং / অথবা উচ্চতা দিয়ে URL এ 'আকার পরিবর্তন' পরামিতি প্রতিস্থাপন করুন। (ডিফল্ট থাম্বনেইলের আকার 220px)।
  4. গুগল ড্রাইভ থেকে পুনরায় আকার দেওয়া থাম্বনেল ডাউনলোড করুন।

এখানে উদাহরণ দেখুন: https://github.com/dobromyslov/google-drive-utils/blob/511c44c2c48862b47c60038423b7f71bf1d28f49/src/index.ts#L150

এবং জিড্রাইভ কোটা থেকে সাবধান থাকুন:

  • প্রতিদিন ক্যোয়ারী: 1000000000
  • প্রতি ব্যবহারকারী প্রতি 100 সেকেন্ডের জন্য ক্যোয়ারী: 1000
  • 100 সেকেন্ড প্রতি 10000: ক্যোয়ারী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.