চিত্রের মাত্রা পাওয়ার দ্রুত উপায় (ফাইল আকার নয়)


138

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

অগ্রাধিকার হিসাবে, আমি এমন একটি উপায় সন্ধান করি যা রুবিতে বা এমনকি 3 রেলগুলিতে ভাল কাজ করে।

আমি তত্ত্বের জিনিসগুলি (বিভিন্ন চিত্রের ফর্ম্যাট, তাদের শিরোনাম এবং তাদের পার্থক্য ইত্যাদি) জানি। প্রকৃতপক্ষে, আমি এমন একটি লাইব্রেরির জন্য বলছি যা আমার সমস্যাটিকে মোটামুটি জেনারিক উপায়ে সমাধান করতে পারে।

আমি স্রেফ ইমেজাইজ পেয়েছি যা আশাব্যঞ্জক বলে মনে হচ্ছে যদিও উন্নয়ন মৃত বলে মনে হচ্ছে।


8
ইমেজম্যাগিকের নতুন সংস্করণগুলির ক্ষেত্রে এটি সত্য বলে মনে হয় না। ইমেজম্যাগিক 6.5.4-7 ব্যবহার করে আমি নিশ্চিত করেছি যে সনাক্তকরণ (কমপক্ষে টিআইএফ এবং পিএনজির জন্য) কেবল শিরোনামটি (60 কেবি পর্যন্ত) পড়ে এবং খুব দ্রুত 335 এমবি চিত্রের জন্যও কাজ করে।
কোডারফরফায়ু

উত্তর:


195
  • fileকমান্ড বিভিন্ন ইমেজ ফরম্যাটের জন্য মাত্রা (যেমন পিএনজি, জিআইএফ, কোন JPEG; সাম্প্রতিক সংস্করণ পিপিএম, webp) ছাপে, এবং শুধুমাত্র হেডার পড়া নেই।

  • identifyকমান্ড (করে ImageMagick থেকে) ইমেজ বিভিন্ন ধরণের জন্য ছবিটি তথ্য প্রচুর ছাপে। এটি শিরোনামের অংশটি পড়ার ক্ষেত্রে নিজেকে সংযত করে বলে মনে হচ্ছে (মন্তব্যগুলি দেখুন)। এটিতে একটি ইউনিফাইড fileআউটপুটও রয়েছে যা দুঃখের সাথে নেই।

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

  • head -n1 আপনাকে পিপিএম, পিজিএম ফর্ম্যাটগুলির জন্য মাত্রা দেবে।

ওয়েবে জনপ্রিয় ফর্ম্যাটগুলির জন্য exiv2এবং উভয়ই identifyকাজটি করবে। ব্যবহারের ক্ষেত্রে উপর নির্ভর করে আপনার নিজের স্ক্রিপ্টটি লিখতে হতে পারে যা বেশ কয়েকটি সরঞ্জামের আউটপুটগুলিকে একত্রিত / পার্স করে।


3
আমি চিহ্নিত চিত্র থেকে কতটা ডেটা পড়েছে তা দেখার জন্য ওপেন / রিড / এমএমএপ / বন্ধ কলগুলি রেকর্ড করতে স্ট্রেস ব্যবহার করে ইমেজম্যাগিক সনাক্তকরণ কমান্ড দিয়ে কিছু পরীক্ষা করেছি। এটি ফাইলের ধরণ এবং ফাইলের আকারের উপর সামান্য নির্ভর করে, তবে আমি ৫--3৩০ এমবি চিত্রের জন্য "সনাক্ত" করে 20-60 কেবি পেয়েছিলাম (আমি "রূপান্তর" এর বিপরীতেও পরীক্ষা করেছি যা সমস্ত বাইট পড়ে দেখায়)। সুতরাং দেখে মনে হচ্ছে এখানে "সনাক্তকরণ" একটি ভাল পছন্দ (যেহেতু এটি সমস্ত জনপ্রিয় ফর্ম্যাটকে সমর্থন করে এবং কেবল শিরোনামটি পড়ে)।
কোডারফরফিলফ

1
আমি মনে করি এক্সিভি 2 পিএনজিও করে।
chx

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

সনাক্ত করুন ওয়েবপির সাথে কাজ করে এবং বছরের পর বছর ধরে ইমেজম্যাগিক ওয়েবপিকে সমর্থন করে। আপনি একটি আপডেট পেতে পারে?
ypnos

32

আমি নিশ্চিত না যে আপনি পিএইচপি ইনস্টল করেছেন তবে এই পিএইচপি ফাংশনটি বেশ কার্যকর

 php -r "print_r(getimagesize('http://www.google.com/images/logos/ps_logo2.png'));"

1
এটি "সনাক্তকরণ" এর চেয়ে অনেক দ্রুত faster ভাল পদ্ধতির। ধন্যবাদ।
সৌরভ

19

আপনি ইমেজম্যাগিকের সনাক্তকরণ ফাংশনটি ব্যবহার করতে পারেন । আপনি এটি কীভাবে ব্যাশে করেন (এখানে দ্রষ্টব্য $ 0 চিত্রটির পথ):

width=$(identify -format "%w" "$0")> /dev/null
height=$(identify -format "%h" "$0")> /dev/null

এবং এটি কোনও সম্ভাব্য ত্রুটি বার্তাও আড়াল করে। identifyকেবলমাত্র শিরোনামের আধুনিক বাস্তবায়ন , পুরো চিত্রটি নয়, এটি দ্রুত is যদিও এটি অন্যান্য পদ্ধতির সাথে তুলনা করে তা নিশ্চিত নয়।


2
আমি বিশ্বাস করি যে এটি আরও কার্যকর এইভাবে:read width height < <(identify -format "%w %h" "${1}")
ক্রোম্যাক্স

5

https://joseluisbz.wordpress.com/2013/08/06/obtaining-size-or-dimesion-of-images/ (বিএমপি, পিএনজি, জিআইএফ, জেপিজি, টিআইএফ বা ডাব্লুএমএফ)

এখানে দুটি ফর্ম্যাট পিএনজি এবং জেপিজির জন্য।

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

দয়া করে পিএইচপি ব্যবহার করে এই ফাংশন / পদ্ধতিটি পরীক্ষা করুন :

  public function ByteStreamImageString($ByteStream,&$Formato,&$Alto,&$Ancho) {
    $Alto = 0;
    $Ancho = 0;
    $Formato = -1;
    $this->HexImageString = "Error";
    if (ord($ByteStream[0])==137 && ord($ByteStream[1])==80 && ord($ByteStream[2])==78){
      $Formato = 1; //PNG
      $Alto = $this->Byte2PosInt($ByteStream[22],$ByteStream[23]);
      $Ancho = $this->Byte2PosInt($ByteStream[18],$ByteStream[19]);
    }
    if (ord($ByteStream[0])==255 && ord($ByteStream[1])==216
        && ord($ByteStream[2])==255 && ord($ByteStream[3])==224){
      $Formato = 2; //JPG
      $PosJPG = 2;
      while ($PosJPG<strlen($ByteStream)){
        if (sprintf("%02X%02X", ord($ByteStream[$PosJPG+0]),ord($ByteStream[$PosJPG+1]))=="FFC0"){
          $Alto = $this->Byte2PosInt($ByteStream[$PosJPG+5],$ByteStream[$PosJPG+6]);
          $Ancho = $this->Byte2PosInt($ByteStream[$PosJPG+7],$ByteStream[$PosJPG+8]);
        }
        $PosJPG = $PosJPG+2+$this->Byte2PosInt($ByteStream[$PosJPG+2],$ByteStream[$PosJPG+3]);
      }
    }
    if ($Formato > 0){
      $this->HexImageString = "";
      $Salto = 0;
      for ($i=0;$i < strlen($ByteStream); $i++){
        $Salto++;
        $this->HexImageString .= sprintf("%02x", ord($ByteStream[$i]));
        if ($Salto==64){
          $this->HexImageString .= "\n";
          $Salto = 0;
        }
      }
    }
  }


  private function Byte2PosInt($Byte08,$Byte00) {
    return ((ord($Byte08) & 0xFF) << 8)|((ord($Byte00) & 0xFF) << 0);
  }

পিএইচপি কোড ব্যবহার করে:

      $iFormato = NULL;//Format PNG or JPG
      $iAlto = NULL; //High
      $iAncho = NULL;//Wide
      ByteStreamImageString($ImageJPG,$iFormato,$iAlto,$iAncho);//The Dimensions will stored in  iFormato,iAlto,iAncho

এখন জাভা ব্যবহার করে এই ফাংশন / পদ্ধতি :

  private void ByteStreamImageString(byte[] ByteStream,int[] Frmt,int[] High,int[] Wide) {
    High[0] = 0;
    Wide[0] = 0;
    Frmt[0] = -1;
    this.HexImageString = "Error";
    if ((int)(ByteStream[0]&0xFF)==137 && (int)(ByteStream[1]&0xFF)==80 &&(int)(ByteStream[2]&0xFF)==78){
      Frmt[0] = 1; //PNG
      High[0] = this.Byte2PosInt(ByteStream[22],ByteStream[23]);
      Wide[0] = this.Byte2PosInt(ByteStream[18],ByteStream[19]);
    }
    if ((int)(ByteStream[0]&0xFF)==255 && (int)(ByteStream[1]&0xFF)==216
        &&(int)(ByteStream[2]&0xFF)==255 && (int)(ByteStream[3]&0xFF)==224){
      Frmt[0] = 2; //JPG
      int PosJPG = 2;
      while (PosJPG<ByteStream.length){
        if (String.format("%02X%02X", ByteStream[PosJPG+0],ByteStream[PosJPG+1]).equals("FFC0")){
          High[0] = this.Byte2PosInt(ByteStream[PosJPG+5],ByteStream[PosJPG+6]);
          Wide[0] = this.Byte2PosInt(ByteStream[PosJPG+7],ByteStream[PosJPG+8]);
        }
        PosJPG = PosJPG+2+this.Byte2PosInt(ByteStream[PosJPG+2],ByteStream[PosJPG+3]);
      }
    }
    if (Frmt[0] > 0){
      this.HexImageString = "";
      int Salto = 0;
      for (int i=0;i < ByteStream.length; i++){
        Salto++;
        this.HexImageString += String.format("%02x", ByteStream[i]);
        if (Salto==64){
          this.HexImageString += "\n";
          Salto = 0;
        }
      }
    }
  }


  private Integer Byte2PosInt(byte Byte08, byte Byte00) {
    return new Integer (((Byte08 & 0xFF) << 8)|((Byte00 & 0xFF) << 0));
  }

জাভা কোড ব্যবহার:

        int[] iFormato = new int[1]; //Format PNG or JPG
        int[] iAlto = new int[1]; //High
        int[] iAncho = new int[1]; //Wide
        ByteStreamImageString(ImageJPG,iFormato,iAlto,iAncho); //The Dimensions will stored in  iFormato[0],iAlto[0],iAncho[0]

আমি দেখছি আপনি জাভায় ref/ outপরামিতিগুলি পেতে হ্যাক হিসাবে আর্গুমেন্টের জন্য অ্যারে ব্যবহার করছেন - এটি কি সেরা অনুশীলন হিসাবে বিবেচিত?
দাই

এই উত্তরটি খুব পুরানো, এখন আমি আপডেট করতে রাজি নই (আমি অনেক কিছুই ভুলে গিয়েছি এবং আমার কাছে সময় নেই) তবে আপনি কোডটি পরীক্ষা করে সম্পাদনা করতে পারেন।
joseluisbz

joseluisbz.wordpress.com/2013/07/26/... (WMF জন্য ব্যাখ্যা)
joseluisbz

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

1

আপনি যে পিক্সেল মাত্রা চান তা (প্রস্থ এবং উচ্চতা), আমি ধরে নিই?

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

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

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

আপডেট : ইমেজ ইনফো দেখে মনে হচ্ছে এটি যা চায় তাই করে। (এটি পরীক্ষা করা হয়নি)


এই সরঞ্জামটি আমার প্রয়োজন তত দ্রুত কাজ করে;)। আমি এটি সঠিকভাবে ব্যবহার করতে পারি কিনা তা দেখতে পাব।
dAnjou

0

ছবিগুলিতে আপনার কাছে এক্সআইএফ তথ্য থাকলে আপনি কেবল এক্সআইএফ শিরোনামটি পড়তে পারেন।


দুর্ভাগ্যজনকভাবে আমি জানি না কী ধরণের চিত্র থাকবে এবং তাদের কাছে এক্সআইএফ ডেটা থাকবে কিনা।
dAnjou

3
আপনার চিত্রগুলির কত না যে তথ্য আছে? হতে পারে তাদের মধ্যে 90% এর যদি এক্সআইএফ ডেটা থাকে তবে অন্য 10% এর উপর ইমেজম্যাগিক ব্যবহারের theিলেটি গ্রহণযোগ্য হবে।
অ্যান্ডি লেস্টার

কেন এই উত্তরটি ডাউনটি আছে? এটি প্রশ্নের বৈধ উত্তর এবং ওপি বা অন্য কেউ যা খুঁজছেন ঠিক তা হতে পারে।
উইল শেপার্ড

0

-pp এমন একটি বিকল্প যা মনে হয় সেই উদ্দেশ্যে পরিচয় করিয়ে দিয়েছে।

তবে ইমেজম্যাগিক 7.7..7 হিসাবে আমি প্রতিটি বড় ফাইলের জন্যও ধীরগতি লক্ষ্য করি না, যেমন:

head -c 100000000 /dev/urandom > f.gray
# I don't recommend that you run this command as it eats a lot of memory.
convert -depth 8 -size 20000x10000 f.gray f.png
identify f.png

আপনি কি একটি উদাহরণ ইনপুট চিত্র তৈরি করতে পারেন যার জন্য এটি এখনও ধীর?


0

tldr: ফাইল "চিত্রের নাম" করবে

ওয়েবপিপি, সমস্ত জেপিজি ফর্ম্যাট (jpeg, jpg200, ..) এর সাথে কাজ করে,

নমুনা আউটপুট মত দেখাচ্ছে

জেপিইজি চিত্রের ডেটা, জেএফআইএফ স্ট্যান্ডার্ড 1.02, দিক অনুপাত, ঘনত্ব 1x1, বিভাগের দৈর্ঘ্য 16, বেসলাইন, যথার্থতা 8, 650x400, ফ্রেম 3

পাইথন তালিকায় ফাইলের আউটপুট লোড করুন এবং তালিকার 4 র্থ ক্ষেত্রটি ব্যবহার করুন।

এফওয়াইআই, নেটওয়ার্ক ট্র্যাফিক কমাতে প্রায় 18000+ চিত্রের অনুকূলিতকরণ করেছিল।

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