2016-12-27 3 views
-1

Я пытаюсь преобразовать изображение в оттенки серого с помощью Go.Преобразование изображения в оттенки серого в Go

Я нашел приведенный ниже код, однако, я стараюсь его понять.

Было бы очень полезно, если бы вы могли объяснить, что делает каждая функция, и где определять входящий и исходящий файл.

package main 

import (
    "image" 
    _ "image/jpeg" // Register JPEG format 
    "image/png" // Register PNG format 
    "image/color" 
    "log" 
    "os" 
) 

// Converted implements image.Image, so you can 
// pretend that it is the converted image. 
type Converted struct { 
    Img image.Image 
    Mod color.Model 
} 

// We return the new color model... 
func (c *Converted) ColorModel() color.Model{ 
    return c.Mod 
} 

// ... but the original bounds 
func (c *Converted) Bounds() image.Rectangle{ 
    return c.Img.Bounds() 
} 

// At forwards the call to the original image and 
// then asks the color model to convert it. 
func (c *Converted) At(x, y int) color.Color{ 
    return c.Mod.Convert(c.Img.At(x,y)) 
} 

func main() { 
    if len(os.Args) != 3 { log.Fatalln("Needs two arguments")} 
    infile, err := os.Open(os.Args[1]) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    defer infile.Close() 

    img, _, err := image.Decode(infile) 
    if err != nil { 
     log.Fatalln(err) 
    } 

    // Since Converted implements image, this is now a grayscale image 
    gr := &Converted{img, color.GrayModel} 
    // Or do something like this to convert it into a black and 
    // white image. 
    // bw := []color.Color{color.Black,color.White} 
    // gr := &Converted{img, color.Palette(bw)} 


    outfile, err := os.Create(os.Args[2]) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    defer outfile.Close() 

    png.Encode(outfile,gr) 
} 

Я совершенно новый, чтобы идти, поэтому любые предложения или помощь будут оценены.

+0

посмотрите [это] (https://maxhalford.github.io/blog/halftoning-1/) статью. –

ответ

2

Как указал Atomic_alarm, https://maxhalford.github.io/blog/halftoning-1/ объясняет, как это сделать лаконично.

Но вы сомневаетесь, если я правильно понимаю, речь идет о открытии и создании файла?

Первый шаг заключается в использовании image пакета Decode открываемого file в image.Image структуру:

infile, err := os.Open("fullcolor.png") 
if err != nil { 
    return nil, err 
} 
defer infile.Close() 

img, _, err := image.Decode(infile) // img -> image.Image 
if err != nil { 
    return nil, err 
} 

С этим Go image.Image-структуры, вы можете преобразовать его в оттенках серого изображения, image.Gray, а затем, наконец, , писать или закодировать изображение на выходном файле на диске:

outfile, _ := os.Create("grayscaled.png") 
defer outfile.Close() 
png.Encode(outfile, grayscaledImage) // grayscaledImage -> image.Gray 

Inbe между открытием и открытием инфилей, вы должны, конечно, преобразовать изображение в оттенки серого. Опять же, попробуйте по ссылке выше, и вы найдете эту функцию, которая принимает image.Image и возвращает указатель на image.Gray:

func rgbaToGray(img image.Image) *image.Gray { 
    var (
     bounds = img.Bounds() 
     gray = image.NewGray(bounds) 
    ) 
    for x := 0; x < bounds.Max.X; x++ { 
     for y := 0; y < bounds.Max.Y; y++ { 
      var rgba = img.At(x, y) 
      gray.Set(x, y, rgba) 
     } 
    } 
    return gray 
} 

Относительно кода вы предоставили (и комментарий), вы открывали файл с os.Args[1], и создается файл os.Args[2]. os.Args является срезом аргументов, передаваемых при выполнении программы, 0 всегда будут сама программа (main), и все, что следует воле 1, 2 и т.д. Документах гласит:

Args держать командную строку аргументы, начиная с имени программы. var Args []string

так что вы бы запустить свой код, приведенный выше, как это:

$ go run main.go infile.png outfile.png 

infile.png должен быть файл на диске (внутри директории вы работаете код с, или полный путь в файл).

То, что я предоставил выше, не использует os.Args, а скорее жестких кодов имена файлов в программе.

+0

Правильно, что я боюсь здесь, так это то, как приведенный выше код читается в файле, когда я заменяю «1» или «2», скажем, «file.png». Я получаю сообщение об ошибке: integer slice index "1.png" ' – CS456

+0

Вы спрашиваете об Args? «Args содержат аргументы командной строки, начиная с имени программы.«Я обновил свой ответ, если это то, что вы ищете – Nevermore

+0

Хорошо, спасибо за разъяснение, я понял это сейчас. Я бы предпочел бы жестко закодировать имена файлов, как вы, конвертировать то, что я предоставил, у вас есть, мне просто нужно изменить способ ввода файла – CS456

Смежные вопросы