DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on

4 1

Go: เปลี่ยนสีรูปเป็น Gray scale

#go

Alt Text

มีงานที่ต้อง process รูปก่อนไปทำ OCR เพื่อให้ program ทำ OCR นั้นแยกแยะตัวอักษรได้ง่ายๆ เลยต้องทำการเปลี่ยนสีรูปให้อยู่ในแบบ Gray Scale ก่อน

ซึ่งสำหรับ Go นั้นทำได้ง่ายๆด้วย Standard library

  • image
  • image/jpeg (เนื่องจาก source เป็น JPEG)
  • image/png (output ออกเป็น PNG)

นี่คือโค้ดที่ทำการแปลง โดย gopher.jpg คือไฟล์รูปที่จะแปลง และ gray_gopher.png คือไฟล์ที่แปลงเรียบร้อยแล้ว

package main

import (
    "image"
    _ "image/jpeg"
    "image/png"
    "log"
    "os"
)

func main() {
    f, err := os.Open("gopher.jpg")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    m, _, err := image.Decode(f)
    if err != nil {
        log.Fatal(err)
    }
    bounds := m.Bounds()
    grayImg := image.NewGray(bounds)
    for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
        for x := bounds.Min.X; x < bounds.Max.X; x++ {
            grayImg.Set(x, y, m.At(x, y))
        }
    }
    grayFile, err := os.Create("gray_gopher.png")
    if err != nil {
        log.Fatal(err)
    }
    defer grayFile.Close()
    if err := png.Encode(grayFile, grayImg); err != nil {
        log.Fatal(err)
    }
}
Enter fullscreen mode Exit fullscreen mode

โค้ดที่ทำมี 3 steps คือ

1) โหลด source ไฟล์แล้วก็ decode ให้มาเป็น image.Image type

    f, err := os.Open("gopher.jpg")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    m, _, err := image.Decode(f)
    if err != nil {
        log.Fatal(err)
    }
Enter fullscreen mode Exit fullscreen mode

2) สร้าง Image ใหม่ให้เป็นแบบ gray scale ด้วย Image.NewGray โดยใช้ขนาดรูปจากรูปต้นฉบับ จากนั้นวนลูปเพื่อดึงค่าสีตามแกน x, y ทีละค่าไปกำหนดให้รูปที่เป็น gray scale เดี๋ยวมันจะแปลงสีให้เอง

    bounds := m.Bounds()
    grayImg := image.NewGray(bounds)
    for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
        for x := bounds.Min.X; x < bounds.Max.X; x++ {
            grayImg.Set(x, y, m.At(x, y))
        }
    }

Enter fullscreen mode Exit fullscreen mode

3) สุดท้ายเราก็เขียนไฟล์รูป grayImg ลงไปโดยใช้ png.Encode เพื่อให้แปลงจาก image.Image เป็นไฟล์ png

    grayFile, err := os.Create("gray_gopher.png")
    if err != nil {
        log.Fatal(err)
    }
    defer grayFile.Close()
    if err := png.Encode(grayFile, grayImg); err != nil {
        log.Fatal(err)
    }
Enter fullscreen mode Exit fullscreen mode

เพียงเท่านี้ก็ได้แล้ว ลองเอาไปประยุกต์ใช้กันดูครับ

ขอฝาก Buy Me a Coffee

สำหรับท่านใดที่อ่านแล้วชอบโพสต์ต่างๆของผมที่นี่ ต้องการสนับสนุนค่ากาแฟเล็กๆน้อยๆ สามารถสนับสนุนผมได้ผ่านทาง Buy Me a Coffee คลิ๊กที่รูปด้านล่างนี้ได้เลยครับ

Buy Me A Coffee

ส่วนท่านใดไม่สะดวกใช้บัตรเครดิต หรือ Paypal สามารถสนับสนุนผมได้ผ่านทาง PromptPay โดยดู QR Code ได้จากโพสต์ที่พินเอาไว้ได้ที่ Page DevDose ครับ https://web.facebook.com/devdoseth

Image of Datadog

Create and maintain end-to-end frontend tests

Learn best practices on creating frontend tests, testing on-premise apps, integrating tests into your CI/CD pipeline, and using Datadog’s testing tunnel.

Download The Guide

Top comments (2)

Collapse
 
jonrandy profile image
Jon Randy 🎖️
import (
    "image"
    _ "image/jpeg"
    "image/png"
    "log"
    "os"
)
Enter fullscreen mode Exit fullscreen mode

What is the purpose of the named, unused image/jpeg import? Maybe just to make sure some JPEG related stuff is initialised?

Collapse
 
iporsut profile image
Weerasak Chongnguluam

Yes, just import for registering image format for image.Decode function.

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay