Решение на Картинки от Александър Иванов

Обратно към всички решения

Към профила на Александър Иванов

Резултати

  • 10 точки от тестове
  • 0 бонус точки
  • 10 точки общо
  • 10 успешни тест(а)
  • 0 неуспешни тест(а)

Код

package main
import (
"strings"
"fmt"
)
type Header struct {
format string
lineWidth int
}
type Color struct {
Red, Green, Blue byte
}
func (c *Color) String() string {
return fmt.Sprintf("Red: %s, Green: %s, Blue: %s", c.Red, c.Green, c.Blue)
}
type Pixel struct {
red, green, blue, alpha float64
}
func (p *Pixel) Color() (color Color) {
color.Red = p.buildByteColor(p.red)
color.Green = p.buildByteColor(p.green)
color.Blue = p.buildByteColor(p.blue)
return color
}
func (p *Pixel) buildByteColor(value float64) byte {
return byte(value * p.alpha * 255)
}
func (p *Pixel) set(property string, value float64) {
switch property {
case "R": p.red = value
case "G": p.green = value
case "B": p.blue = value
case "A": p.alpha = value
}
}
type Image struct {
header Header
pixels []Pixel
}
func (i *Image) lineWidth() int {
return i.header.lineWidth
}
func (i *Image) InspectPixel(column, row int) Pixel {
return i.pixels[row * i.lineWidth() + column]
}
func ParseImage(data []byte, header Header) (image Image) {
image.header = header
step := len(header.format)
useDefaultAlpha := !strings.Contains(header.format, "A")
for i := 0; i < len(data); i += step {
pixel := new(Pixel)
for j, property := range header.format {
pixel.set(string(property), float64(data[i+j]) / 255.0)
}
if useDefaultAlpha {
pixel.alpha = 1.0
}
image.pixels = append(image.pixels, *pixel)
}
return
}

Лог от изпълнението

PASS
ok  	_/tmp/d20131125-20161-1ydggjn	0.011s
PASS
ok  	_/tmp/d20131125-20161-1ydggjn	0.011s
PASS
ok  	_/tmp/d20131125-20161-1ydggjn	0.014s
PASS
ok  	_/tmp/d20131125-20161-1ydggjn	0.011s
PASS
ok  	_/tmp/d20131125-20161-1ydggjn	0.015s
PASS
ok  	_/tmp/d20131125-20161-1ydggjn	0.011s
PASS
ok  	_/tmp/d20131125-20161-1ydggjn	0.012s
PASS
ok  	_/tmp/d20131125-20161-1ydggjn	0.011s
PASS
ok  	_/tmp/d20131125-20161-1ydggjn	0.011s
PASS
ok  	_/tmp/d20131125-20161-1ydggjn	0.011s

История (1 версия и 0 коментара)

Александър обнови решението на 09.11.2013 13:48 (преди над 4 години)

+package main
+
+import (
+ "strings"
+ "fmt"
+)
+
+type Header struct {
+ format string
+ lineWidth int
+}
+
+type Color struct {
+ Red, Green, Blue byte
+}
+
+func (c *Color) String() string {
+ return fmt.Sprintf("Red: %s, Green: %s, Blue: %s", c.Red, c.Green, c.Blue)
+}
+
+type Pixel struct {
+ red, green, blue, alpha float64
+}
+
+func (p *Pixel) Color() (color Color) {
+ color.Red = p.buildByteColor(p.red)
+ color.Green = p.buildByteColor(p.green)
+ color.Blue = p.buildByteColor(p.blue)
+ return color
+}
+
+func (p *Pixel) buildByteColor(value float64) byte {
+ return byte(value * p.alpha * 255)
+}
+
+func (p *Pixel) set(property string, value float64) {
+ switch property {
+ case "R": p.red = value
+ case "G": p.green = value
+ case "B": p.blue = value
+ case "A": p.alpha = value
+ }
+}
+
+type Image struct {
+ header Header
+ pixels []Pixel
+}
+
+func (i *Image) lineWidth() int {
+ return i.header.lineWidth
+}
+
+func (i *Image) InspectPixel(column, row int) Pixel {
+ return i.pixels[row * i.lineWidth() + column]
+}
+
+func ParseImage(data []byte, header Header) (image Image) {
+ image.header = header
+
+ step := len(header.format)
+
+ useDefaultAlpha := !strings.Contains(header.format, "A")
+
+ for i := 0; i < len(data); i += step {
+ pixel := new(Pixel)
+
+ for j, property := range header.format {
+ pixel.set(string(property), float64(data[i+j]) / 255.0)
+ }
+
+ if useDefaultAlpha {
+ pixel.alpha = 1.0
+ }
+
+ image.pixels = append(image.pixels, *pixel)
+ }
+
+ return
+}