रैस्टराइज़्ड टेक्स्ट का आकार बदलें और इसे गैर-पिक्सेलेटेड दिखें


11

यह एक टेक्स्ट एडिटर में टाइप किए गए कुछ टेक्स्ट का स्क्रीनशॉट है:

16px-उच्च पाठ

यह बड़े आकार में एक ही पाठ है।

96px-उच्च पाठ

ध्यान दें कि अलियासिंग अक्षरों पर दिखाई देता है जैसे कि प्रमुख विकर्ण स्ट्रोक xऔर z। यह मुद्दा एक प्रमुख कारण है कि रैस्टर फोंट ने ट्रू टाइप की तरह "स्केलेबल" स्वरूपों में लोकप्रियता खो दी है।

लेकिन शायद यह रास्टर फोंट के साथ एक अंतर्निहित समस्या नहीं है, जिस तरह से उनमें से स्केलिंग आमतौर पर लागू की जाती है। थ्रेसहोल्डिंग के साथ संयुक्त सरल बिलिनियर इंटरपोलेशन का उपयोग करके एक वैकल्पिक रेंडरिंग है

96px-उच्च पाठ बिलिनियर प्रक्षेप के साथ प्रदान किया गया

यह चिकना है, लेकिन आदर्श नहीं है। विकर्ण स्ट्रोक अभी भी ऊबड़ हैं, और घुमावदार पत्र जैसे cऔर oअभी भी बहुभुज हैं। यह विशेष रूप से बड़े आकारों में ध्यान देने योग्य है।

तो क्या कोई बेहतर तरीका है?

काम

एक प्रोग्राम लिखें जो तीन कमांड-लाइन तर्क लेता है।

resize INPUT_FILE OUTPUT_FILE SCALE_FACTOR

कहाँ पे

  • INPUT_FILE इनपुट फ़ाइल का नाम है, जिसे एक सफेद पृष्ठभूमि पर काले पाठ वाली छवि फ़ाइल माना जाता है। आप किसी भी मुख्यधारा रेखापुंज छवि प्रारूप (पीएनजी, बीएमपी, आदि) का उपयोग कर सकते हैं जो सुविधाजनक है।
  • OUTPUT_FILE आउटपुट फ़ाइल का नाम है। यह या तो एक रेखापुंज या वेक्टर छवि प्रारूप हो सकता है। यदि आप कुछ ClearType- जैसे सबपिक्सल रेंडरिंग कर रहे हैं तो आप रंग पेश कर सकते हैं।
  • SCALE_FACTOR एक सकारात्मक फ़्लोटिंग-पॉइंट मान है जो इंगित करता है कि छवि का आकार कितना हो सकता है। एक x × y px इनपुट फ़ाइल और स्केलिंग फ़ैक्टर s को देखते हुए , आउटपुट का आकार sx × sy px (पूर्णांकों तक होगा) होगा।

आप तृतीय-पक्ष ओपन-सोर्स इमेज प्रोसेसिंग लाइब्रेरी का उपयोग कर सकते हैं।

अपने कोड के अलावा, इनपुट के रूप में मेरी पहली छवि का उपयोग करके 1.333, 1.5, 2, 3 और 4 के पैमाने पर अपने कार्यक्रम के नमूना आउटपुट शामिल करें । आप इसे आनुपातिक-स्थान वाले अन्य फोंट के साथ भी आज़मा सकते हैं।

स्कोरिंग

यह एक लोकप्रियता प्रतियोगिता है। माइनस डाउनवोट्स की सबसे बड़ी संख्या के साथ प्रवेश जीतता है। एक सटीक टाई के मामले में, पहले की प्रविष्टि जीत जाती है।

संपादित करें : प्रविष्टियों की कमी के कारण समय सीमा बढ़ाई गई। टीबीए।

मतदाताओं को मुख्य रूप से यह देखने के लिए प्रोत्साहित किया जाता है कि आउटपुट चित्र कितने अच्छे दिखते हैं, और दूसरा एल्गोरिथम की सादगी / शान पर।


है SCALE_FACTORहमेशा> 1?
kennytm

@kennytm: हाँ। स्केल कारकों को स्पष्ट रूप से सूचीबद्ध करने के लिए संपादित किया है।
dan04

क्या हम मान सकते हैं कि छवि में केवल एक पंक्ति का पाठ है?
जाइंटट्री

@GiantTree: हाँ। यदि आप चाहें, तो आप बहु-पंक्ति पाठ का समर्थन कर सकते हैं, लेकिन इसकी आवश्यकता नहीं है।
dan04

जवाबों:


4

रूबी, RMagick के साथ

एल्गोरिथ्म बहुत सरल है - इस तरह दिखने वाले पिक्सेल के पैटर्न खोजें:

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

और त्रिकोण बनाने के लिए उन्हें इस तरह देखो:

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

कोड:

#!/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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.