ปรับขนาดข้อความแรสเตอร์และทำให้มันดูไม่ใช่ตัวอักษร


11

นี่คือภาพหน้าจอของข้อความบางส่วนที่พิมพ์ในโปรแกรมแก้ไขข้อความ:

ข้อความสูง 16px

นี่คือข้อความเดียวกันที่มีขนาดใหญ่กว่า

ข้อความสูง 96px

แจ้งให้ทราบว่าที่มองเห็นaliasingอยู่ในตัวอักษรที่มีจังหวะในแนวทแยงที่โดดเด่นเหมือนและx zปัญหานี้เป็นสาเหตุสำคัญที่ทำให้ฟอนต์แรสเตอร์สูญเสียความนิยมในรูปแบบ "ปรับขนาดได้" เช่น TrueType

แต่นี่อาจไม่ใช่ปัญหาที่เกิดจากการใช้ฟอนต์แรสเตอร์ แต่โดยทั่วไปแล้ววิธีการปรับสเกลของมันจะถูกนำไปใช้ นี่คือการแสดงผลทางเลือกที่ใช้ง่ายแก้ไข bilinearรวมกับthresholding

ข้อความที่แสดงสูงถึง 96px พร้อมการแก้ไขแบบสองมิติ

นี่คือเรียบเนียน แต่ไม่เหมาะ ลายเส้นทแยงมุมยังคงเป็นหลุมเป็นบ่อและตัวอักษรที่มีลักษณะโค้งcและoยังเป็นรูปหลายเหลี่ยม โดยเฉพาะอย่างยิ่งในขนาดใหญ่

ดังนั้นจะมีวิธีที่ดีกว่า

งาน

เขียนโปรแกรมที่ใช้อาร์กิวเมนต์บรรทัดคำสั่งสามข้อ

resize INPUT_FILE OUTPUT_FILE SCALE_FACTOR

ที่ไหน

  • INPUT_FILE เป็นชื่อของไฟล์อินพุตซึ่งถือว่าเป็นไฟล์ภาพที่มีข้อความสีดำบนพื้นหลังสีขาว คุณสามารถใช้รูปแบบภาพแรสเตอร์กระแสหลักใดก็ได้(PNG, BMP และอื่น ๆ ) ที่สะดวก
  • OUTPUT_FILE เป็นชื่อของไฟล์ที่ส่งออก มันอาจเป็นรูปแบบภาพแรสเตอร์หรือเวกเตอร์ คุณอาจแนะนำสีถ้าคุณทำการเรนเดอร์พิกเซลย่อยแบบ ClearType บางอย่าง
  • SCALE_FACTOR เป็นค่าจุดลอยตัวที่เป็นบวกซึ่งระบุจำนวนของภาพที่อาจถูกปรับขนาด เมื่อกำหนดไฟล์อินพุตx × y px และตัวประกอบสเกลsเอาต์พุตจะมีขนาดเป็นsx × sy px (ปัดเศษเป็นจำนวนเต็ม)

คุณสามารถใช้ไลบรารี่การประมวลผลภาพโอเพนซอร์สที่สามได้

นอกจากโค้ดของคุณแล้วให้รวมเอาตัวอย่างผลลัพธ์ของโปรแกรมของคุณที่สเกลแฟคเตอร์ที่ 1.333, 1.5, 2, 3 และ 4โดยใช้อิมเมจแรกของฉันเป็นอินพุต นอกจากนี้คุณยังสามารถลองใช้กับแบบอักษรอื่นรวมถึงแบบเว้นวรรคตามสัดส่วน

เกณฑ์การให้คะแนน

นี่คือการประกวดความนิยม รายการที่มีจำนวนมากที่สุดของ upvotes ลบ downvotes ชนะ ในกรณีที่เสมอกันรายการก่อนหน้าชนะ

แก้ไข : ขยายกำหนดเวลาเนื่องจากไม่มีรายการ จะแจ้งภายหลัง

ผู้มีสิทธิเลือกตั้งควรได้รับการสนับสนุนให้ตัดสินโดยพิจารณาจากภาพที่ส่งออกดูดีเพียงใด


อยู่SCALE_FACTORเสมอ> 1 หรือไม่
kennytm

@kennytm: ใช่ มีการแก้ไขเพื่อแสดงรายการปัจจัยระดับอย่างชัดเจน
dan04

เราสามารถสมมติว่ามีข้อความเพียงบรรทัดเดียวในภาพได้หรือไม่?
GiantTree

@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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.