রাস্টারযুক্ত পাঠ্যকে পুনরায় আকার দিন এবং এটিকে পিক্সেলবিহীন দেখায়


11

এটি কোনও পাঠ্য সম্পাদককে টাইপ করা কিছু পাঠ্যের স্ক্রিনশট:

16px- উচ্চ পাঠ্য

এটি বৃহত্তর আকারে একই পাঠ্য।

96px- উচ্চ পাঠ্য

লক্ষ্য করুন কিভাবে প্রোফাইল এলিয়াসিং মত বিশিষ্ট তির্যক স্ট্রোক সঙ্গে অক্ষর চালু থাকে xএবং z। এই ইস্যুটি রাস্টার ফন্টগুলি ট্রুটাইপের মতো "স্কেলেবল" ফর্ম্যাটে জনপ্রিয়তা হারিয়ে যাওয়ার প্রধান কারণ।

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

96px- উচ্চ পাঠ্যটি বিলিনিয়ার অন্তরঙ্গকরণের সাথে রেন্ডার হয়েছে

এটি মসৃণ তবে আদর্শ নয়। ডায়াগোনাল স্ট্রোকগুলি এখনও অগভীর এবং বাঁকা অক্ষরগুলির মতো cএবং oএখনও বহুভুজ। এটি বড় আকারের বিশেষত লক্ষণীয়।

তাহলে এর চেয়ে ভাল উপায় আর কি আছে?

কাজটি

একটি প্রোগ্রাম লিখুন যা তিনটি কমান্ড-লাইন আর্গুমেন্ট গ্রহণ করে।

resize INPUT_FILE OUTPUT_FILE SCALE_FACTOR

কোথায়

  • INPUT_FILE ইনপুট ফাইলের নাম, যা একটি সাদা পটভূমিতে কালো টেক্সটযুক্ত একটি চিত্র ফাইল বলে ধরে নেওয়া হয়। আপনি যে কোনও মূলধারার রাস্টার চিত্রের ফর্ম্যাট (পিএনজি, বিএমপি ইত্যাদি) ব্যবহার করতে পারেন যা সুবিধাজনক।
  • OUTPUT_FILE আউটপুট ফাইলের নাম। এটি কোনও রাস্টার বা ভেক্টর চিত্র ফর্ম্যাট হতে পারে। আপনি কিছু ক্লিয়ারটাইপের মতো সাবপিক্সেল রেন্ডারিং করছেন যদি আপনি রঙ প্রবর্তন করতে পারেন।
  • এসসিএএলএইএফএএলএইসিএটি একটি ইতিবাচক ভাসমান-পয়েন্ট মান যা ইমেজটিকে কতটা আকার পরিবর্তন করতে পারে তা নির্দেশ করে। একটি x × y px ইনপুট ফাইল এবং স্কেলিং ফ্যাক্টর s দেওয়া , আউটপুটটিতে sx × sy px (পূর্ণসংখ্যার বৃত্তাকার) হবে।

আপনি তৃতীয়-প্যারী ওপেন-সোর্স ইমেজ প্রসেসিং লাইব্রেরি ব্যবহার করতে পারেন।

আপনার কোড ছাড়াও, ইনপুট হিসাবে আমার প্রথম চিত্রটি ব্যবহার করে আপনার প্রোগ্রামের নমুনা আউটপুটগুলি 1.333, 1.5, 2, 3 এবং 4 এর স্কেল ফ্যাক্টরগুলিতে অন্তর্ভুক্ত করুন। আপনি আনুপাতিকভাবে ব্যবধানযুক্ত অন্য ফন্টগুলির সাথেও এটি ব্যবহার করতে পারেন।

স্কোরিং

এটি একটি জনপ্রিয়তা প্রতিযোগিতা। সর্বমোট সংখ্যক আপভোট বিয়োগের ডাউনভোটেসের সাথে এন্ট্রি জয়ী। সঠিক টাইয়ের ক্ষেত্রে পূর্বের প্রবেশটি জয়ী হয়।

সম্পাদনা : প্রবেশের অভাবে সময়সীমা বাড়ানো হয়েছে। ধাই।

ভোটারদের আউটপুট চিত্রগুলি কতটা ভাল লাগে তার ভিত্তিতে এবং দ্বিতীয়ত অ্যালগরিদমের সরলতা / কমনীয়তার ভিত্তিতে বিচার করার জন্য উত্সাহিত করা হয়।


কি SCALE_FACTORসবসময়> 1?
কেনেটিএম

@ টেনিটেম: হ্যাঁ স্কেল কারণগুলি স্পষ্টভাবে তালিকাভুক্ত করতে সম্পাদনা করেছেন।
dan04

আমরা কি ধরে নিতে পারি যে চিত্রটিতে কেবল একটি লাইন আছে?
জায়ান্ট্রি ট্রি

@ জায়েন্টটি: হ্যাঁ আপনি চাইলে মাল্টি-লাইন পাঠ্য সমর্থন করতে পারেন, তবে এটি প্রয়োজন হয় না।
dan04

উত্তর:


4

রুবি, আরম্যাগিকের সাথে

অ্যালগরিদমটি খুব সহজ p পিক্সেলের ধরণগুলি এর মতো দেখতে পান:

    ####
    ####
    ####
    ####
########
########
########
########

এবং এগুলি দেখতে দেখতে ত্রিভুজ যুক্ত করুন:

    ####
   #####
  ######
 #######
########
########
########
########

কোড:

#!/usr/bin/ruby

require 'rmagick'
require 'rvg/rvg'
include Magick

img = Image.read(ARGV[0] || 'img.png').first
pixels = []
img.each_pixel{|px, x, y|
    if px.red == 0 && px.green == 0 && px.blue == 0
        pixels.push [x, y]
    end
}

scale = ARGV[2].to_f || 5.0
rvg = RVG.new((img.columns * scale).to_i, (img.rows * scale).to_i)
    .viewbox(0, 0, img.columns, img.rows) {|cnv|
    # draw all regular pixels
    pixels.each do |p|
        cnv.rect(1, 1, p[0], p[1])
    end
    # now collect all 2x2 rectangles of pixels
    getpx = ->x, y { !!pixels.find{|p| p[0] == x && p[1] == y } }
    rects = [*0..img.columns].product([*0..img.rows]).map{|x, y|
        [[x, y], [
            [getpx[x, y  ], getpx[x+1, y  ]],
            [getpx[x, y+1], getpx[x+1, y+1]]
        ]]
    }
    # WARNING: ugly code repetition ahead
    # (TODO: ... fix that)
    # find this pattern:
    # ?X
    # XO
    # where X = black pixel, O = white pixel, ? = anything
    rects.select{|r| r[1][0][1] && r[1][1][0] && !r[1][2][1] }
        .each do |r|
            x, y = r[0]
            cnv.polygon x+1,y+1, x+2,y+1, x+1,y+2
        end
    # OX
    # X?
    rects.select{|r| r[1][0][1] && r[1][3][0] && !r[1][0][0] }
        .each do |r|
            x, y = r[0]
            cnv.polygon x+1,y+1, x+0,y+1, x+1,y+0
        end
    # X?
    # OX
    rects.select{|r| r[1][0][0] && r[1][4][1] && !r[1][5][0] }
        .each do |r|
            x, y = r[0]
            cnv.polygon x+1,y+1, x+0,y+1, x+1,y+2
        end
    # XO
    # ?X
    rects.select{|r| r[1][0][0] && r[1][6][1] && !r[1][0][1] }
        .each do |r|
            x, y = r[0]
            cnv.polygon x+1,y+1, x+2,y+1, x+1,y+0
        end
}
rvg.draw.write(ARGV[1] || 'out.png')

আউটপুট (নিজেই ছবিটি দেখতে যে কোনওটিকে ক্লিক করুন):

1,333

1,333

1.5

1.5

2

2

3

3

4

4

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