এমএস পেইন্ট আন্ডাররেটেড হয়


48

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

চ্যালেঞ্জ

কেবলমাত্র ডিফল্ট ব্রাশ (কোনও কোণ ছাড়াই একটি 4x4 বর্গক্ষেত্র) এবং ডিফল্ট রঙ প্যালেট (নীচে ২৮ টি রঙ) ব্যবহার করে স্টোকাস্টিক পাহাড়ী আরোহণের উপর ভিত্তি করে একটি কৌশল ব্যবহার করে উত্স চিত্রটি প্রতিলিপি করার চেষ্টা করুন ।

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

অ্যালগরিদম

প্রতিটি উত্তরের অবশ্যই একই বুনিয়াদি অ্যালগরিদম (স্টোকাস্টিক হিল ক্লাইম্ব) অনুসরণ করা উচিত। প্রতিটি পদক্ষেপের মধ্যে বিশদগুলি টুইট করা যেতে পারে। একটি আন্দোলন ব্রাশের স্ট্রোক হিসাবে বিবেচিত হয় (অর্থাত্ পেইন্টে ক্লিক করা)।

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

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

Contraints

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

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

  • উত্স চিত্র এবং বর্তমান পুনরাবৃত্তির মধ্যে "পার্থক্য" এর পরিমাপ আপনি পরিমাপ করতে পারবেন তবে আপনি যতক্ষণ চান, যতক্ষণ না এই আন্দোলনটিকে "সেরা" হিসাবে বিবেচনা করা হয় কিনা তা নির্ধারণের জন্য এটি অন্যান্য সম্ভাব্য গতিবিধি গণনা করে না। এটি জানা উচিত নয় যে বর্তমান আন্দোলনটি "সেরা" কিনা তা কেবল গ্রহণযোগ্যতার মানদণ্ডের সহনশীলতার মধ্যে ফিট করে কিনা। উদাহরণস্বরূপ, এটি abs(src.R - current.R) + abs(src.G - current.G) + abs(src.B - current.B)প্রতিটি আক্রান্ত পিক্সেল, বা সুপরিচিত রঙের পার্থক্য কৌশলগুলির মতো সহজ হতে পারে ।

প্যালেট

আপনি প্যালেটটি 28x1 চিত্র হিসাবে ডাউনলোড করতে পারেন বা কোডটিতে সরাসরি তৈরি করতে পারেন।

ব্রাশের

ব্রাশটি কোনও কোণ ছাড়াই 4x4 বর্গক্ষেত্র। এটি এটির একটি ছোট আকারের সংস্করণ:

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

(আপনার কোড অবশ্যই 4x4 সংস্করণ ব্যবহার করা উচিত)

উদাহরণ

ইনপুট:

ভ্যান গগ - দ্য স্টারি নাইট

আউটপুট:

স্টারি নাইট উত্পন্ন

আমি তৈরি করা একটি ছোট ভিডিওতে আপনি কীভাবে বুনিয়াদি অ্যালগরিদম অগ্রগতি করতে পারেন তা দেখতে পাবেন (প্রতিটি ফ্রেমটি 500 টি পুনরাবৃত্তি): দ্য স্টারি নাইট । প্রাথমিক পর্যায়গুলি দেখতে আকর্ষণীয়:

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


1
@ vihan1086: উত্স চিত্রটিতে স্বচ্ছতা নেই। বর্তমান চিত্রটি পূর্ববর্তী পুনরাবৃত্তির উপর নির্ভর করতে পারে (আমার উদাহরণের মতো, যা পূর্বের উপরে নতুন পয়েন্ট যুক্ত করা হয়) যদি আপনি এর অর্থ বোঝাতে চান তবে।
গ্রোভসএনএল

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

@ স্প 000০০০: মুল বক্তব্যটি হ'ল আপনি "সেরা" আন্দোলনটি জানেন না যতক্ষণ না এটি একটি সম্ভাব্য আন্দোলন না হওয়া পর্যন্ত আপনি নিজের গ্রহণযোগ্যতার মানদণ্ডের সাথে মানানসই হয় তবে এটি গ্রহণ করতে বেছে নিতে পারেন (যেমন, এটি "যথেষ্ট নিকটে" ")। গ্রহণযোগ্যতার মানদণ্ডে সমস্ত সম্ভাব্য পদক্ষেপের জ্ঞান থাকা উচিত নয় (আমার এটি আরও পরিষ্কার করার প্রয়োজন হতে পারে)। মূলত আপনি সময়ের আগে "সেরা" আন্দোলন নির্ধারণ করতে সক্ষম হবেন না, পরিবর্তে আপনার চিত্রটি ক্রমবর্ধমান করা উচিত।
গ্রোভসএনএল

এই ব্রাশের আকারের সাহায্যে, কোণ পিক্সেলগুলি আঁকানো কি অসম্ভব (আপনার উদাহরণ থেকে আমি এই ধারণাটি পেয়েছি), বা ব্রাশটি চিত্রের সীমানার বাইরে আংশিকভাবে স্থাপন করা যেতে পারে?
অলিফোঁট

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

উত্তর:


35

জাভাস্ক্রিপ্ট

এই সমাধানটি চিত্রের ডেটা বের করার জন্য এইচটিএমএল 5 ক্যানভাস উপাদান ব্যবহার করে, তবে এইচটিএমএল ব্যবহারের প্রয়োজন ছাড়াই, এর অর্থ এটি আপনার কনসোলে চালানো যেতে পারে। এটি অ্যারে হিসাবে রঙ প্যালেট চিত্র অ্যাক্সেস করে; আমি প্যালেট চিত্র থেকে সমস্ত রং একটি অ্যারেতে সঞ্চয় করেছি)। এটি কনসোল আউটপুট করে (এটি শেষ হওয়ার পরে) এবং ফলাফলটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করে।

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

এমএস পেইন্ট আইকন আকারে কোড! (ফিডল বা স্ট্যাক স্নিপেটে ফর্ম্যাট কোড)

eval(`                                                   function                  
                                                        Paint(t){fun              
                                                         ction n(t){va            
                                                         r n=t.toString(          
                                                         16);return 1==n.         
                                                         length?"0"+n:n}fu        
                                                         nction e(t){return       
                                                         "#"+n(t[0])+n(t[1]       
                                                          )+n(t[2])}var a=ne      
                                                          w Image,i=document.     
                                                          createElement("canv     
                                                          as"),h=null,o=docum     
                                                          ent.createElement(      
                                    "canvas"),r=          o.getContext("2d        
                               ")     ,l=[],u=this,c      =[[0,0,0],[255          
                            ,2       55,255],[ 192,192,   192],[128,12            
                          8     ,128],[126,3,8],[252,13,27] ,[255,25              
                       3,    56],[128,127,23],[15,127,18],[ 41,253                
                      ,    46],[45,255,254],[17,128,127],[2 ,12,1                 
                    2    6],[ 11,36,2 51],[252,40,252],[12 7,15,1                 
                  2    6],[  128,127 ,68],[255,253,136],[4 2,253,                 
                 1   33],   [4,64,64],[23 ,131,251],[133,255,254],                
               [    129   ,132,252],[6,6 6,126],[127,37,2 51],[127,               
              6   4,1    3],[253,128,73],[252,22,129]];a.crossOrigin              
             =   "",   a.src=t,this.done=this.done||function(){},a.o              
            n   load=function(){function t(t){var n=0,e=0,a=0;return              
           t  .forEach(function(t){n+=t[0],e+=t[1],a+=t[2]}),[n/t.leng            
          t  h,e /t.length,a/t.length]}function n(t){for(var n=[],e=0;e           
         <  t.l  ength;e+=1)n.push(t[e]);return n}function g(t,n){retur           
        n  (Ma  th.abs(t[0]-n[0])/255+Math.abs(t[1]-n[1])/255+Math.abs(t          
       [  2]- n[2])/255)/3}function f(t,n){for(var e=Math.floor(Math.ran          
          do m()*n.length),a=n[e],i=(g(t,a),1-.8),h=56,o=[];o.length<=h&          
         &g (t,a)>i;)if(o.push(a),a=n[Math.floor(Math.random()*n.length)]         
     ,  o.length==h){var r=o.map(function(n){return g(t,n)});a=o[r.indexO         
       f(Math.max.apply(Math,r))],o.push(a)}return a}function s(t,n){for(         
    v  ar e=[];t.length>0;)e.push(t.splice(0,n).slice(0,-1));return e}i.w         
   i  dth=a.width,i.height=2*a.height,h=i.getContext("2d"),h.drawImage(a,0        
   ,0,a.width,a.height);for(var d=(function(t){reduce=t.map(function(t){re        
  turn(t[ 0]+t[1]+t[2])/3})}(c),0),m=0,v=i.width*i.height/4,p=0;v>p;p+=1)d        
  >2*Mat h.ceil(a.width/2)&&(d=0,m+=1),l.push(f(t(s(n(h.getImageData(2*d,2        
  *m,4,4).data),4)),c)),d+=1;o.width=i.width,o.height=i.height;for(var d=0        
 ,m=0,v=i.width*i.height/4,p=0;v>p;p+=1)d>2*Math.ceil(a.width/2)&&(d=0,m+=        
 1),console.log("Filling point ("+d+", "+m+") : "+e(l[p])),r.fillStyle=e(l        
 [p]),r.fillRect(2*d+1,2*m,2,1)  ,r.fillRect(2*d,2*m+1,4,2),r.fillRect(2*d        
+1,2*m+3,2,1),d+=1;u.result=o      .toDataURL("image/png"),u.resultCanvas         
=o,u.imageCanvas=i,u.image=a       ,u.done(),console.log(u.result)},a.one         
rror=function(t){console.log       ("The image failed to load. "+t)}}/*..         
............................       ......................................         
. ..........................       .....................................          
............................      ......................................          
.............................    .......................................          
.......................................................................           
.......................................................................           
..................  ..................................................            
................     .................................................            
..............       ................................................             
.............       ................................................              
...........        .................................................              
 .........         ................................................               
 .......          ................................................                
  ....           ................................................                 
                ................................................                  
                ...............................................                   
               ...............................................                    
              ..............................................                      
              .............................................                       
             ............................................                         
             ..........................................                           
              .......................................                             
              .....................................                               
               .................................                                  
                .............................                                     
                  ......................                                          
                                   .....                                          
                                  .....                                           
                                  .....                                           
                                  ....                                            
                                   */`
.replace(/\n/g,''))                                             

ব্যবহার:

Paint('DATA URI');

বেহালার

ফিডল ক্রসরিগিন.এম ব্যবহার করে যাতে আপনার ক্রস-অরিজিন-রিসোর্স ভাগ করে নেওয়ার বিষয়ে চিন্তা করার দরকার নেই।

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


স্ট্যাক-স্নিপেট হিসাবে এখানে ফিডল রয়েছে (যদি আপডেট হয়নি তবে ফিডালটি কাজ না করে):


নিউ হরাইজন ফ্লুবাইয়ের প্লুটো স্মরণে, আমি প্লুটো একটি চিত্র ইনপুট করেছি:

মূল টানা

মূল টানা

নিম্নলিখিতগুলির জন্য আমি এটি যথাসম্ভব নিকটবর্তী মূলের সাথে সাদৃশ্যযুক্ত করার জন্য সেট করে রেখেছি:

আমি ওএস এক্স ইয়োসেমাইটের ডিফল্ট ওয়ালপেপার দিয়ে এটি চালিয়েছি। এটি কিছুক্ষণ চালানোর পরে, ফলাফলগুলি একেবারে অত্যাশ্চর্য। মূল ফাইলটি বিশাল (26 মেগাবাইট) ছিল তাই আমি এটি পুনরায় আকার দিয়ে সংকুচিত করেছি:

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

তারার রাত (আমি আরও ভাল ফলাফলের জন্য উচ্চতর রেজোলিউশন চিত্রটি ব্যবহার করেছি )

গুগলে আমি একটি ছবি পেয়েছি: এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


12

জাভাস্ক্রিপ্ট + এইচটিএমএল

এলোমেলো:

র্যান্ডম পয়েন্ট

এলোমেলোভাবে সাজানো:

ক্যানভাসকে 4x4 স্কোয়ারে বিভক্ত করে এবং একটি স্কোয়ারের অভ্যন্তরে এলোমেলোভাবে একটি বিন্দু বেছে নেয়। অফসেটগুলি গ্রিডটি স্থানান্তরিত করবে, যাতে আপনি সামান্য শূন্যস্থান পূরণ করতে পারেন।

লুপ:

গ্রিড তৈরি করে এবং সমস্ত পয়েন্টের মাধ্যমে লুপ করে। অফসেটগুলি গ্রিডটি সরায়। ব্যবধান প্রতিটি কক্ষের আকার নির্ধারণ করে। (তারা ওভারল্যাপ করা শুরু করবে)

রঙের পার্থক্য:

  • আরজিবি
  • HSL
  • HSV

var draw = document.getElementById("canvas").getContext("2d");
var data = document.getElementById("data").getContext("2d");
colors = [
    [0, 0, 0],
    [255, 255, 255],
    [192, 192, 192],
    [128, 128, 128],
    [126, 3, 8],
    [252, 13, 27],
    [255, 253, 56],
    [128, 127, 23],
    [15, 127, 18],
    [41, 253, 46],
    [45, 255, 254],
    [17, 128, 127],
    [2, 12, 126],
    [11, 36, 251],
    [252, 40, 252],
    [127, 15, 126],
    [128, 127, 68],
    [255, 253, 136],
    [42, 253, 133],
    [4, 64, 64],
    [23, 131, 251],
    [133, 255, 254],
    [129, 132, 252],
    [6, 66, 126],
    [127, 37, 251],
    [127, 64, 13],
    [253, 128, 73],
    [252, 22, 129]
];
iteration = 0;
fails = 0;
success = 0;
x = 0;
y = 0;
//Init when the Go! button is pressed
document.getElementById("file").onchange = function (event) {
    document.getElementById("img").src = URL.createObjectURL(event.target.files[0]);
    filename = document.getElementById("file").value;
    /*if (getCookie("orginal") == filename) {
        console.log("Loading from Cookie");
        reload = true;
        document.getElementById("reload").src = getCookie("picture");
    }*/
};

/*function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1);
        if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
    }
    return "";
}*/

//Run when the image has been loaded into memory
document.getElementById("img").onload = function () {
    document.getElementById("file").disable = "true";
    document.getElementById("canvas").hidden = "";
    document.getElementById("canvas").height = document.getElementById("img").height;
    document.getElementById("data").height = document.getElementById("img").height;
    document.getElementById("canvas").width = document.getElementById("img").width;
    document.getElementById("data").width = document.getElementById("img").width;

    var imgData = draw.createImageData(document.getElementById("img").width, document.getElementById("img").height);
    for (var i = 0; i < imgData.data.length; i += 4) {
        imgData.data[i + 0] = 0;
        imgData.data[i + 1] = 0;
        imgData.data[i + 2] = 0;
        imgData.data[i + 3] = 255;
    }
    draw.putImageData(imgData, 0, 0);
    data.putImageData(imgData, 0, 0);
    if (reload == true) {
        draw.drawImage(document.getElementById("reload"), 0, 0);
    }
    data.drawImage(document.getElementById("img"), 0, 0);
    setInterval(function () {
        for (var u = 0; u < document.getElementById("selectColor").value; u++) {
            doThing();
        }
    }, 0);
};

//The core function. Every time this function is called, is checks/adds a dot.
function doThing() {
    getCoords();
    paintBucket();
    console.count("Iteration");
    if (compare(x, y)) {
        draw.putImageData(imgData, x, y);
    }
}

function getCoords() {
    switch (document.getElementById("selectCord").value) {
        case "1":
            x = Math.floor(Math.random() * (document.getElementById("img").width + 4));
            y = Math.floor(Math.random() * (document.getElementById("img").height + 4));
            break;
        case "2":
            x = Math.floor(Math.random() * ((document.getElementById("img").width + 4) / 4)) * 4;
            console.log(x);
            x += parseInt(document.getElementById("allignX").value);
            console.log(x);
            y = Math.floor(Math.random() * ((document.getElementById("img").height + 4) / 4)) * 4;
            y += parseInt(document.getElementById("allignY").value);
            break;
        case "3":
            x += parseInt(document.getElementById("loopX").value);
            if (x > document.getElementById("img").width + 5) {
                x = parseInt(document.getElementById("allignX").value);
                y += parseInt(document.getElementById("loopY").value);
            }
            if (y > document.getElementById("img").height + 5) {
                y = parseInt(document.getElementById("allignY").value);
            }
    }
}

function compare(arg1, arg2) {
    var arg3 = arg1 + 4;
    var arg4 = arg2 + 4;
    imgData2 = data.getImageData(arg1, arg2, 4, 4);
    imgData3 = draw.getImageData(arg1, arg2, 4, 4);
    N = 0;
    O = 0;
    i = 4;
    addCompare();
    addCompare();
    i += 4;
    for (l = 0; l < 8; l++) {
        addCompare();
    }
    i += 4;
    addCompare();
    addCompare();
    i += 4;
    //console.log("New Score: " + N + " Old Score: " + O);
    iteration++;
    /*if(iteration>=1000){
        document.cookie="orginal="+filename;
        document.cookie="picture length="+document.getElementById("canvas").toDataURL().length;
        document.cookie="picture="+document.getElementById("canvas").toDataURL();
        
    }*/
    if (N < O) {
        return true;
    } else {
        return false;
    }
}

function addCompare() {
    if (document.getElementById("colorDif").value == "HSL") {
        HSLCompare();
        i += 4;
        return;
    }
    if (document.getElementById("colorDif").value == "HSV") {
        HSVCompare();
        i += 4;
        return;
    }
    N += Math.abs(imgData.data[i] - imgData2.data[i]);
    N += Math.abs(imgData.data[i + 1] - imgData2.data[i + 1]);
    N += Math.abs(imgData.data[i + 2] - imgData2.data[i + 2]);
    O += Math.abs(imgData3.data[i] - imgData2.data[i]);
    O += Math.abs(imgData3.data[i + 1] - imgData2.data[i + 1]);
    O += Math.abs(imgData3.data[i + 2] - imgData2.data[i + 2]);
    i += 4;
}

function HSVCompare() {
    var NewHue = rgbToHsv(imgData.data[i], imgData.data[i + 1], imgData.data[i + 2])[0];
    var PicHue = rgbToHsv(imgData2.data[i], imgData2.data[i + 1], imgData2.data[i + 2])[0];
    var OldHue = rgbToHsv(imgData3.data[i], imgData3.data[i + 1], imgData3.data[i + 2])[0];

    var NScore = [Math.abs(NewHue - PicHue), ((NewHue < PicHue) ? NewHue + (1 - PicHue) : PicHue + (1 - NewHue))];
    var OScore = [Math.abs(OldHue - PicHue), ((OldHue < PicHue) ? OldHue + (1 - PicHue) : PicHue + (1 - OldHue))];
    
    
    NScore = Math.min(NScore[0], NScore[1]);
    OScore = Math.min(OScore[0], OScore[1]);
    
    NewHue = rgbToHsv(imgData.data[i], imgData.data[i + 1], imgData.data[i + 2])[1];
    PicHue = rgbToHsv(imgData2.data[i], imgData2.data[i + 1], imgData2.data[i + 2])[1];
    OldHue = rgbToHsv(imgData3.data[i], imgData3.data[i + 1], imgData3.data[i + 2])[1];
    
    NScore += Math.abs(NewHue-PicHue);
    OScore += Math.abs(OldHue-PicHue);
    
    NewHue = rgbToHsv(imgData.data[i], imgData.data[i + 1], imgData.data[i + 2])[2];
    PicHue = rgbToHsv(imgData2.data[i], imgData2.data[i + 1], imgData2.data[i + 2])[2];
    OldHue = rgbToHsv(imgData3.data[i], imgData3.data[i + 1], imgData3.data[i + 2])[2];
    
    N += Math.abs(NewHue-PicHue) + NScore;
    O += Math.abs(OldHue-PicHue) + OScore;
}

function rgbToHsv(r, g, b){
    r = r/255, g = g/255, b = b/255;
    var max = Math.max(r, g, b), min = Math.min(r, g, b);
    var h, s, v = max;

    var d = max - min;
    s = max == 0 ? 0 : d / max;

    if(max == min){
        h = 0; // achromatic
    }else{
        switch(max){
            case r: h = (g - b) / d + (g < b ? 6 : 0); break;
            case g: h = (b - r) / d + 2; break;
            case b: h = (r - g) / d + 4; break;
        }
        h /= 6;
    }

    return [h, s, v];
}

function HSLCompare() {
    var result = 0;
    rgb = false;

    var NewHue = rgbToHue(imgData.data[i], imgData.data[i + 1], imgData.data[i + 2])[0];
    var PicHue = rgbToHue(imgData2.data[i], imgData2.data[i + 1], imgData2.data[i + 2])[0];
    var OldHue = rgbToHue(imgData3.data[i], imgData3.data[i + 1], imgData3.data[i + 2])[0];
    if (rgb == true) {
        N += Math.abs(imgData.data[i] - imgData2.data[i]);
        N += Math.abs(imgData.data[i + 1] - imgData2.data[i + 1]);
        N += Math.abs(imgData.data[i + 2] - imgData2.data[i + 2]);
        O += Math.abs(imgData3.data[i] - imgData2.data[i]);
        O += Math.abs(imgData3.data[i + 1] - imgData2.data[i + 1]);
        O += Math.abs(imgData3.data[i + 2] - imgData2.data[i + 2]);
        return;
    }
    var NScore = [Math.abs(NewHue - PicHue), ((NewHue < PicHue) ? NewHue + (1 - PicHue) : PicHue + (1 - NewHue))];
    var OScore = [Math.abs(OldHue - PicHue), ((OldHue < PicHue) ? OldHue + (1 - PicHue) : PicHue + (1 - OldHue))];
    
    
    NScore = Math.min(NScore[0], NScore[1]);
    OScore = Math.min(OScore[0], OScore[1]);
    
    NewHue = rgbToHue(imgData.data[i], imgData.data[i + 1], imgData.data[i + 2])[1];
    PicHue = rgbToHue(imgData2.data[i], imgData2.data[i + 1], imgData2.data[i + 2])[1];
    OldHue = rgbToHue(imgData3.data[i], imgData3.data[i + 1], imgData3.data[i + 2])[1];
    
    NScore += Math.abs(NewHue-PicHue);
    OScore += Math.abs(OldHue-PicHue);
    
    NewHue = rgbToHue(imgData.data[i], imgData.data[i + 1], imgData.data[i + 2])[2];
    PicHue = rgbToHue(imgData2.data[i], imgData2.data[i + 1], imgData2.data[i + 2])[2];
    OldHue = rgbToHue(imgData3.data[i], imgData3.data[i + 1], imgData3.data[i + 2])[2];
    
    N += Math.abs(NewHue-PicHue) + NScore;
    O += Math.abs(OldHue-PicHue) + OScore;
}

function rgbToHue(r, g, b) {
    if (Math.max(r, g, b) - Math.min(r, g, b) < 50) {
        rgb = true
    }
    r /= 255, g /= 255, b /= 255;
    var max = Math.max(r, g, b),
        min = Math.min(r, g, b);
    var h, s, l = (max + min) / 2;

    if (max == min) {
        h = s = 0; // achromatic
    } else {
        var d = max - min;
        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
        switch (max) {
            case r:
                h = (g - b) / d + (g < b ? 6 : 0);
                break;
            case g:
                h = (b - r) / d + 2;
                break;
            case b:
                h = (r - g) / d + 4;
                break;
        }
        h /= 6;
    }
    return [h,s,l];
}

//Create a 4x4 ImageData object, random color selected from the colors var, transparent corners.
function paintBucket() {
    color = Math.floor(Math.random() * 28);
    imgData = draw.createImageData(4, 4);
    imgData2 = draw.getImageData(x, y, 4, 4);
    i = 0;
    createCorn();
    createColor();
    createColor();
    createCorn();
    for (l = 0; l < 8; l++) {
        createColor();
    }
    createCorn();
    createColor();
    createColor();
    createCorn();
}

function createCorn() {
    imgData.data[i] = imgData2.data[i];
    imgData.data[i + 1] = imgData2.data[i + 1];
    imgData.data[i + 2] = imgData2.data[i + 2];
    imgData.data[i + 3] = 255;
    i += 4;
}

function createColor() {
    imgData.data[i] = colors[color][0];
    imgData.data[i + 1] = colors[color][1];
    imgData.data[i + 2] = colors[color][2];
    imgData.data[i + 3] = 255;
    i += 4;
}
<canvas id="canvas" hidden></canvas>
<br>
<canvas id="data" hidden></canvas>
<br>
<input type="file" id="file"></input>
<br>
<img id="img">
<img id="reload" hidden>
<p>Algorithms:</p>
<select id="selectCord">
    <option value="1">Random</option>
    <option value="2">Random Alligned</option>
    <option value="3" selected>Loop</option>
</select>
<select id="selectColor">
    <option value="2000">Super Speedy</option>
    <option value="1000">Very Speedy</option>
    <option value="500" selected>Speedy</option>
    <option value="1">Visual</option>
</select>
<select id="colorDif">
    <option value="RGB" selected>RGB</option>
    <option value="HSL">HSL</option>
    <option value="HSV">HSV</option>
</select>
<p>Algorithm Options:
    <br>
</p>
<p>X Offset:
    <input id="allignX" type="range" min="0" max="3" value="0"></input>
</p>
<p>Y Offset:
    <input id="allignY" type="range" min="0" max="3" value="0"></input>
</p>
<p>Spacing X:
    <input id="loopX" type="range" min="1" max="4" value="2"></input>
</p>
<p>Spacing Y:
    <input id="loopY" type="range" min="1" max="4" value="2"></input>
</p>

এখানে চিত্র বর্ণনা লিখুন
আরজিবি: এখানে চিত্র বর্ণনা লিখুন
এইচএসএল: এখানে চিত্র বর্ণনা লিখুন
এইচএসভি: এখানে চিত্র বর্ণনা লিখুন


খুব ঠান্ডা. "রান কোড স্নিপেট" আমার জন্য বিরতি দেয় যখন এটি সেট করার চেষ্টা করে document.cookie(1000 পুনরাবৃত্তির পরে) কারণ দস্তাবেজটি স্যান্ডবক্সযুক্ত। কুকি কি প্রয়োজনীয়?
গ্রোভসএনএল

না, একবারে আমি কয়েক ঘন্টা প্রোগ্রাম চালিয়েছিলাম, কিন্তু তারপরে আমার ব্রাউজারটি ক্র্যাশ হয়ে গেছে। তাই আমি কুকিকে ব্যাকআপ জিনিস হিসাবে বেক করেছি। তবে আমি এটি সরিয়ে ফেলব কারণ মনে হচ্ছে স্ট্যাক এক্সচেঞ্জ কুকিজকে অপছন্দ করে।
গ্র্যান্ট ডেভিস

1
আপনার কোডটির দিকে তাকিয়ে, আমি মনে করি যে ওল্ফহ্যামার এর উত্তরেরdoThing পরিবর্তে প্রয়োগ না করে আমি যে একই গতি সম্পন্ন করেছিলাম তা থেকে এটি উপকৃত হতে পারে loop। অতিরিক্ত রেখার গতি বৃদ্ধি পেতে পারে ...
ট্রাইকোপল্যাক্স

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

দারুণ! নতুন আউটপুট চিত্রটি আরও ভাল দেখাচ্ছে।
ট্রাইকোপ্লাক্স

8

সি # (রেফারেন্স বাস্তবায়ন)

এই প্রশ্নটি ইমেজ তৈরি করতে ব্যবহৃত কোড। আমি ভেবেছিলাম কিছু লোককে তাদের অ্যালগোরিদম সংগঠিত করার জন্য একটি রেফারেন্স দেওয়া কার্যকর হবে। প্রতিটি আন্দোলন একটি সম্পূর্ণ র্যান্ডম স্থানাঙ্ক এবং রঙ নির্বাচন করা হয়। এটি ব্রাশের আকার / গ্রহণযোগ্যতার মানদণ্ডের দ্বারা আরোপিত সীমাবদ্ধতাগুলি বিবেচনা করে আশ্চর্যজনকভাবে ভাল সম্পাদন করে।

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

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using ColorMine.ColorSpaces;
using ColorMine.ColorSpaces.Comparisons;

namespace Painter
{
    public class Painter
    {
        private readonly Bitmap _source;
        private readonly Bitmap _painting;
        private readonly int _width;
        private readonly int _height;
        private readonly CieDe2000Comparison _comparison = new CieDe2000Comparison();
        private const int BRUSHSIZE = 4;
        private readonly Random _random = new Random();
        private readonly ColorPalette _palette;

        private static readonly int[][] BRUSH = {
            new[] {1, 0}, new[] {2, 0},
            new[] {0, 1}, new[] {1, 1}, new[] {2, 1}, new[] {3, 1}, 
            new[] {0, 2}, new[] {1, 2}, new[] {2, 2}, new[] {3, 2}, 
            new[] {1, 3}, new[] {2, 3}
        };

        public Painter(string sourceFilename, string paletteFilename)
        {
            _source = (Bitmap)Image.FromFile(sourceFilename);
            _width = _source.Width;
            _height = _source.Height;

            _palette = Image.FromFile(paletteFilename).Palette;
            _painting = new Bitmap(_width, _height, PixelFormat.Format8bppIndexed) {Palette = _palette};

            // search for black in the color palette
            for (int i = 0; i < _painting.Palette.Entries.Length; i++)
            {
                Color color = _painting.Palette.Entries[i];
                if (color.R != 0 || color.G != 0 || color.B != 0) continue;
                SetBackground((byte)i);
            }
        }

        public void Paint()
        {
            // pick a color from the palette
            int brushIndex = _random.Next(0, _palette.Entries.Length);
            Color brushColor = _palette.Entries[brushIndex];

            // choose coordinate
            int x = _random.Next(0, _width - BRUSHSIZE + 1);
            int y = _random.Next(0, _height - BRUSHSIZE + 1);

            // determine whether to accept/reject brush
            if (GetBrushAcceptance(brushColor, x, y))
            {
                BitmapData data = _painting.LockBits(new Rectangle(0, y, _width, BRUSHSIZE), ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
                byte[] bytes = new byte[data.Height * data.Stride];
                Marshal.Copy(data.Scan0, bytes, 0, bytes.Length);

                // apply 4x4 brush without corners
                foreach (int[] offset in BRUSH)
                {
                    bytes[offset[1] * data.Stride + offset[0] + x] = (byte)brushIndex;
                }
                Marshal.Copy(bytes, 0, data.Scan0, bytes.Length);
                _painting.UnlockBits(data);
            }
        }

        public void Save(string filename)
        {
            _painting.Save(filename, ImageFormat.Png);
        }

        private void SetBackground(byte index)
        {
            BitmapData data = _painting.LockBits(new Rectangle(0, 0, _width, _height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
            byte[] bytes = new byte[data.Height * data.Stride];
            for (int i = 0; i < data.Height; i++)
            {
                for (int j = 0; j < data.Stride; j++)
                {
                    bytes[i*data.Stride + j] = index;
                }
            }
            Marshal.Copy(bytes, 0, data.Scan0, bytes.Length);
            _painting.UnlockBits(data);
        }

        private bool GetBrushAcceptance(Color brushColor, int x, int y)
        {
            double currentDifference = 0.0;
            double brushDifference = 0.0;
            foreach (int[] offset in BRUSH)
            {
                Color sourceColor = _source.GetPixel(x + offset[0], y + offset[1]);
                Rgb sourceRgb = new Rgb {R = sourceColor.R, G = sourceColor.G, B = sourceColor.B};
                Color currentColor = _painting.GetPixel(x + offset[0], y + offset[1]);

                currentDifference += sourceRgb.Compare(new Rgb {R = currentColor.R, G = currentColor.G, B = currentColor.B}, _comparison);
                brushDifference += sourceRgb.Compare(new Rgb {R = brushColor.R, G = brushColor.G, B = brushColor.B}, _comparison);
            }
            return brushDifference < currentDifference;
        }
    }
}

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

namespace Painter
{
    class Program
    {
        private static void Main(string[] args)
        {
            int i = 0;
            int counter = 1;
            Painter painter = new Painter(args[0], args[1]);
            while (true)
            {
                painter.Paint();
                if (i%500000 == 0)
                {
                    counter++;
                    painter.Save(string.Format("{0}{1:D7}.png", args[2], counter));
                }
                i++;
            }
        }
    }
}

আমি অনলাইনে কিছু রঙিন ক্যানভাস চিত্রগুলি অনুসন্ধান করেছি এবং নীচের চিত্রগুলি জুড়ে এসেছি, যা দুর্দান্ত (জটিল) পরীক্ষামূলক চিত্র বলে মনে হচ্ছে। সমস্ত কপিরাইট স্ব স্ব মালিকদের অন্তর্গত।

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

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

উৎস

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

উৎস


এইভাবে আমি জানি আমি কিছুই সম্পর্কে কিছুই জানি না। দুর্দান্ত সমাধান
ব্র্যান্ডন

6

জাভাস্ক্রিপ্ট ক্যানভাস

হালনাগাদ

মন্তব্যে দুর্দান্ত পরামর্শ। এটি এখন দ্রুত এবং ইউআইকে ধীর করে না!

function previewFile() {
  var srcImage = document.getElementById('srcImage');
  var file = document.querySelector('input[type=file]').files[0];
  var reader = new FileReader();

  reader.onloadend = function() {
    srcImage.src = reader.result;
  }

  if (file) {
    reader.readAsDataURL(file);
  } else {
    srcImage.src = "";
  }
}

var buckets = []; // buckets / iterations
var iter_per_focus = 5000;

var pal = "00FFFF,0000FF,00FF00,FFFF00,\
C0C0C0,FF0000,FF00FF,FFFF78,\
FF0078,FF7848,7878FF,78FFFF,\
00FF78,784800,007800,\
007878,787800,780000,787878,\
000078,780078,004878,7800FF,\
0078FF,004848,787848,000000,FFFFFF".split(",");
var pLen = pal.length;
var p = 0;
var _R = 0;
var _G = 1;
var _B = 2;
var _CAN = 3;

// Create fast access palette with r,g,b values and
// brush image for color.
function initPal() {

  for (var i = 0; i < pal.length; i++) {
    var r = parseInt(pal[i].substr(0, 2), 16);
    var g = parseInt(pal[i].substr(2, 2), 16);
    var b = parseInt(pal[i].substr(4, 2), 16);
    var pcan = document.createElement('canvas');
    pcan.width = 4;
    pcan.height = 4;
    var pctx = pcan.getContext('2d');
    pctx.fillStyle = '#' + pal[i];
    pctx.beginPath();
    pctx.rect(1, 0, 2, 4);
    pctx.rect(0, 1, 4, 2);
    pctx.fill();

    pal[i] = [r,g,b,pcan];

  }
}
initPal();

var score = [];
var can = document.getElementById("canB");
var ctx = can.getContext('2d');
var mainDiv = document.getElementById("main");
var bCan = document.createElement('canvas');
bCan.width = can.width;
bCan.height = can.height;
var bCtx = bCan.getContext('2d');

var canA = document.getElementById("canA");
can.width = can.height = canA.width = canA.height = 200;
var ctxA = canA.getContext('2d');
var imageData;
var data;

function getSrcImage() {
  var img = document.getElementById('srcImage');
  can.width = canA.width = img.width;
  can.height = canA.height = img.height;
  ctxA.drawImage(img, 0, 0);
  imageData = ctxA.getImageData(0, 0, img.width, img.height);
  data = imageData.data;
  
  // adjust for brush offset
  var w = can.width - 2;
  var h = can.height - 2;
  
  var n = Math.floor((w * h) / iter_per_focus);
  buckets = [];
  for (var i = 0; i < n; i++) {
    var bucket = [];
    bucket.r = Math.floor(Math.random() * pLen);
    buckets.push(bucket);
  }
  var b = 0;
  var pt = 0;
  for (var y = 0; y < h; y++) {
    for (var x = 0; x < w; x++, pt+=4) {
      var r = Math.floor((Math.random() * n));
      buckets[r].push([x,y,pt,256 * 12,Math.floor(Math.random()*pLen)]);
      b %= n;
    }
    pt += 8; // move past brush offset.
  }
    
}

var loopTimeout = null;

function loopInit() {
  var r, y, x, pt, c, s;
  var row = can.width * 4;
  
  var b = 0;

  function loop() {
    clearTimeout(loopTimeout);
    var bucket = buckets[b++];
    var len = bucket.length;
    // Stepping color
    //c = pal[p];
    // Pulsing color;
    //c = pal[Math.floor(Math.random()*pLen)]
    // Pulsting step
    c = pal[bucket.r++];
    bucket.r%=pLen;
    b %= buckets.length;
    if (b === 0) {
      p++;
      p%=pLen;
    }
    
    for (var i = 0; i < len; i++) {

      var x = bucket[i][0]
      var y = bucket[i][1];
      var pt = bucket[i][2];
      // Random color
      //c = pal[bucket[i][4]++];
      //bucket[i][4]%=pLen;
      
     
      s = Math.abs(data[pt] - c[_R]) +
        Math.abs(data[pt + 1] - c[_G]) +
        Math.abs(data[pt + 2] - c[_B]) +
        Math.abs(data[pt + 4] - c[_R]) +
        Math.abs(data[pt + 5] - c[_G]) +
        Math.abs(data[pt + 6] - c[_B]) +
        Math.abs(data[pt + row] - c[_R]) +
        Math.abs(data[pt + row + 1] - c[_G]) +
        Math.abs(data[pt + row + 2] - c[_B]) +
        Math.abs(data[pt + row + 4] - c[_R]) +
        Math.abs(data[pt + row + 5] - c[_G]) +
        Math.abs(data[pt + row + 6] - c[_B]);
      if (bucket[i][3] > s) {
        bucket[i][3] = s;
        bCtx.drawImage(c[_CAN], x - 1, y - 1);
      }

    }
    loopTimeout = setTimeout(loop, 0);
  }

  loop();
}

// Draw function is separate from rendering. We render
// to a backing canvas first.
function draw() {
  ctx.drawImage(bCan, 0, 0);
  setTimeout(draw, 100);
}

function start() {

  getSrcImage();
  imageData = ctxA.getImageData(0, 0, can.width, can.height);
  data = imageData.data;
  bCan.width = can.width;
  bCan.height = can.height;
  bCtx.fillStyle = "black";
  bCtx.fillRect(0, 0, can.width, can.height);
  loopInit();

  draw();
}
body {
  background-color: #444444;
  color: #DDDDEE;
}
#srcImage {
  display: none;
}
#testBtn {
  display: none;
}
#canA {
  display:none;
}
<input type="file" onchange="previewFile()">
<br>
<img src="" height="200" alt="Upload Image for MS Painting">

<button onclick="genImage()" id="testBtn">Generate Image</button>

<div id="main">
  <img id="srcImage" src="" onload="start()">
  <canvas id="canA"></canvas>
  <canvas id="canB"></canvas>
</div>


@ টিরিচোপ্লেক্স ছবিটি লোড করার সাথে আমার কিছু ক্রস সাইট সমস্যা ছিল। আমি কিছু খুঁজে বের করতে পারি কিনা তা আমি দেখব।
উলফহ্যামার

1
@ থ্রিচোপল্যাক্স কোন অন্ধকার ইচ্ছাকৃত ছিল না। এটি উত্পন্ন চিত্রের স্বচ্ছতার সাথে একটি বাগ ছিল। তুলনা কোডটি স্বচ্ছ বলে মনে করা উচিত কালো।
উলফহ্যামার

@ ট্রাইকপ্লেক্স আমি এটিকে কেবল একটি এলোমেলো রঙের তুলনায় পরিবর্তন করেছি changed
ওল্ফহ্যামার

1
আমি আপনার কোডটি একটি জেসফিডেলে অনুলিপি করে একটি পরীক্ষার চেষ্টা করেছি। এটি কিছুটা দ্রুত রূপান্তর করেছে । আপনি এটি চেষ্টা করতে পছন্দ করতে পারেন ... আমি যা করেছি তা লুপ ফাংশনের সামগ্রীতে 1000 বার পুনরাবৃত্তি করার জন্য লুপের সাথে ছিল surround এর অর্থ মাউস এবং কীবোর্ড ইভেন্টগুলি কেবল প্রতিটি পুনরাবৃত্তির পরিবর্তে প্রতি 1000 পুনরাবৃত্তির জন্য পরীক্ষা করা হয়। আপনার লুপটি যথেষ্ট দ্রুতগতি সম্পন্ন যে প্রতি 1000 পুনরাবৃত্তির ফলে মাউস এবং কীবোর্ড প্রতিক্রিয়াশীল হয়ে যায় এবং এটি
কনভার্জেন্সের

1
@ ট্রাইকোলপ্ল্যাক্স বাহ এই পরামর্শগুলি জিনিসগুলিকে অনেক দ্রুত তৈরি করেছে। আমি মনে করি s / = 4 দরকার, আমি এটির সাথে শীতল রঙের অ্যানিমেশন পাই না।
উলফহ্যামার

3

ম্যাথামেটিকাল

এটি যদিও এত দ্রুত নয় তবে কমপক্ষে এটি অস্পষ্টভাবে চিহ্নিতযোগ্য চিত্রগুলি তৈরি করে, তাই আমি খুশি।

img = Import["http://i.stack.imgur.com/P7X6g.jpg"]
squigglesize = 20;
squiggleterb = 35;
colors = Import["http://i.stack.imgur.com/u9JAD.png"];
colist = Table[RGBColor[PixelValue[colors, {x, 1}]], {x, 28}];
imgdim0 = ImageDimensions[img];
curimg = Image[ConstantArray[0, Reverse[imgdim0]]];

rp := RandomInteger[squigglesize, 2] - squigglesize/2;
i = 0; j = 0;
Module[{imgdim = imgdim0, randimg, points, randcol, squigmid, st, 
  randist, curdist = curdist0, i = 0, j = 0},

 While[j < 10,
  squigmid = {RandomInteger[imgdim[[1]]], RandomInteger[imgdim[[1]]]};      
  While[i < 20,
   randcol = RandomChoice[colist];
   st = RandomInteger[squiggleterb, 2] - squiggleterb/2;
   points = {rp + squigmid + st, rp + squigmid + st, rp + squigmid + st, rp + squigmid + st};

   randimg = 
    Rasterize[
     Style[Graphics[{Inset[curimg, Center, Center, imgdim],
        {randcol, BezierCurve[Table[{-1, 0}, {4}] + points]},
        {randcol, BezierCurve[Table[{-1, 1}, {4}] + points]},
        {randcol, BezierCurve[Table[{0, -1}, {4}] + points]},
        {randcol, BezierCurve[points]},
        {randcol, BezierCurve[Table[{0, 1}, {4}] + points]},
        {randcol, BezierCurve[Table[{0, 2}, {4}] + points]},
        {randcol, BezierCurve[Table[{1, -1}, {4}] + points]},
        {randcol, BezierCurve[Table[{1, 0}, {4}] + points]},
        {randcol, BezierCurve[Table[{1, 1}, {4}] + points]},
        {randcol, BezierCurve[Table[{1, 2}, {4}] + points]},
        {randcol, BezierCurve[Table[{2, 0}, {4}] + points]},
        {randcol, BezierCurve[Table[{2, 1}, {4}] + points]}
       }, ImageSize -> imgdim, PlotRange -> {{0, imgdim[[1]]}, {0, imgdim[[2]]}}], 
      Antialiasing -> False], RasterSize -> imgdim];
   randist = ImageDistance[img, randimg];
   If[randist < curdist, curimg = randimg; curdist = randist; i = 0; 
    j = 0;];
   i += 1;
   ]; j += 1; i = 0;];
 Print[curimg]]

আউটপুট:

ইনপুট আউটপুট

ইনপুট আউটপুট

আউটপুট সম্ভবত আরও পুনরাবৃত্তির সাথে কিছুটা ভাল হতে পারে এবং এখনও অনেক কিছু আছে যা আমি এটির গতি বাড়ানোর / রূপান্তরকে উন্নত করার চেষ্টা করতে পারি, তবে আপাতত এটি যথেষ্ট ভাল বলে মনে হচ্ছে।


2

SmileBASIC

OPTION STRICT
OPTION DEFINT

DEF MSPAINT(IMAGE,WIDTH,HEIGHT,STEPS)
 'read color data
 DIM COLORS[28]
 COPY COLORS%,@COLORS
 @COLORS
 DATA &H000000,&H808080,&H800000
 DATA &H808000,&H008000,&H008080
 DATA &H000080,&H800080,&H808040
 DATA &H004040,&H0080FF,&H004080
 DATA &H8000FF,&H804000,&HFFFFFF
 DATA &HC0C0C0,&HFF0000,&HFFFF00
 DATA &H00FF00,&H00FFFF,&H0000FF
 DATA &HFF00FF,&HFFFF80,&H00FF80
 DATA &H80FFFF,&H8080FF,&HFF0080
 DATA &HFF8040

 'create output array and fill with white
 DIM OUTPUT[WIDTH,HEIGHT]
 FILL OUTPUT,&HFFFFFFFF

 VAR K
 FOR K=1 TO STEPS
  'Pick random position/color
  VAR X=RND(WIDTH -3)
  VAR Y=RND(HEIGHT-3)
  VAR COLOR=COLORS[RND(28)]

  'Extract average (really the sum) color in a 4x4 area.
  'this is less detailed than checking the difference of every pixel
  'but it's better in some ways...
  'corners are included so it will do SOME dithering
  'R1/G1/B1 = average color in original image
  'R2/G2/B2 = average color in current drawing
  'R3/G3/B3 = average color if brush is used
  VAR R1=0,G1=0,B1=0,R2=0,G2=0,B2=0,R3=0,G3=0,B3=0
  VAR R,G,B
  VAR I,J
  FOR J=0 TO 3
   FOR I=0 TO 3
    'original image average
    RGBREAD IMAGE[Y+J,X+I] OUT R,G,B
    INC R1,R
    INC G1,G
    INC B1,B
    'current drawing average
    RGBREAD OUTPUT[Y+J,X+I] OUT R,G,B
    INC R2,R
    INC G2,G
    INC B2,B
    'add the old color to the brush average if we're in a corner
    IF (J==0||J==3)&&(I==0||I==3) THEN
     INC R3,R
     INC G3,G
     INC B3,B
    ENDIF
   NEXT
  NEXT
  'brush covers 12 pixels
  RGBREAD COLOR OUT R,G,B
  INC R3,R*12
  INC G3,G*12
  INC B3,B*12

  'Compare
  BEFORE=ABS(R1-R2)+ABS(G1-G2)+ABS(B1-B2)
  AFTER =ABS(R1-R3)+ABS(G1-G3)+ABS(B1-B3)

  'Draw if better
  IF AFTER<BEFORE THEN
   FILL OUTPUT,COLOR, Y   *WIDTH+X+1,2 ' ##
   FILL OUTPUT,COLOR,(Y+1)*WIDTH+X  ,4 '####
   FILL OUTPUT,COLOR,(Y+2)*WIDTH+X  ,4 '####
   FILL OUTPUT,COLOR,(Y+3)*WIDTH+X+1,2 ' ##
  ENDIF
 NEXT

 RETURN OUTPUT
END

MSPAINT ইমেজ% [] , প্রস্থ% , উচ্চতা% , ধাপ% আউট আউটপুট% []

  • চিত্র% - 2D [y, x] চিত্রের ডেটা সহ পূর্ণসংখ্যা অ্যারে (32 বিট এআরজিবি ফর্ম্যাট (আলফা উপেক্ষা করা হবে))
  • প্রস্থ% - চিত্র প্রস্থ
  • উচ্চতা% - চিত্রের উচ্চতা
  • পদক্ষেপগুলি% - পুনরাবৃত্তির সংখ্যা
  • আউটপুট% - আউটপুট অ্যারে, চিত্র% এর সমান।

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


আপনি কিছু উদাহরণ যুক্ত করতে পারেন?
ড্রামে

হ্যাঁ, আমি শীঘ্রই কিছু যুক্ত করব (যদিও চিত্রগুলি স্থানান্তর করতে এটি অনেক কাজ, সুতরাং আমাকে এখনই পর্দার ছবি তুলতে হবে)
12
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.