Решение на Картинки от Недялко Андреев

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

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

Резултати

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

Код

package main
import "fmt"
type Header struct {
Format string
LineWidth int
}
type Color struct {
Red, Green, Blue byte
}
func (c Color) String() string {
return fmt.Sprintf("Red: %d, Green: %d, Blue: %d", c.Red, c.Green, c.Blue)
}
type Pixel struct {
c Color
}
func (p Pixel) Color() Color {
return p.c
}
type Image struct {
Width, Height int
Data []Pixel
}
func (i Image) InspectPixel(col, row int) Pixel {
return i.Data[row*i.Width+col]
}
func MakePixel(format string, pixelData []byte) Pixel {
var red, green, blue byte
var alpha float32 = 255
// TODO: parse the format string only once and return a
// closure that makes custom pixels according to that header
for i := range format {
switch {
case format[i] == 'R':
red = pixelData[i]
case format[i] == 'G':
green = pixelData[i]
case format[i] == 'B':
blue = pixelData[i]
case format[i] == 'A':
alpha = float32(pixelData[i])
}
}
red = byte(float32(red) * alpha / 255)
green = byte(float32(green) * alpha / 255)
blue = byte(float32(blue) * alpha / 255)
return Pixel{Color{red, green, blue}}
}
func ParseImage(data []byte, header Header) Image {
dataLength := len(data)
pixelDataLength := len(header.Format)
pixelCount := dataLength / pixelDataLength
imageWidth := header.LineWidth
imageHeight := pixelCount / imageWidth
var img = new(Image)
img.Data = make([]Pixel, imageWidth*imageHeight)
img.Width = imageWidth
img.Height = imageHeight
for i := 0; i < pixelCount; i++ {
img.Data[i] = MakePixel(header.Format, data[i*pixelDataLength:(i+1)*pixelDataLength])
}
return *img
}

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

PASS
ok  	_/tmp/d20131125-20161-1d0rjn9	0.011s
PASS
ok  	_/tmp/d20131125-20161-1d0rjn9	0.011s
PASS
ok  	_/tmp/d20131125-20161-1d0rjn9	0.011s
PASS
ok  	_/tmp/d20131125-20161-1d0rjn9	0.040s
PASS
ok  	_/tmp/d20131125-20161-1d0rjn9	0.012s
PASS
ok  	_/tmp/d20131125-20161-1d0rjn9	0.011s
PASS
ok  	_/tmp/d20131125-20161-1d0rjn9	0.011s
PASS
ok  	_/tmp/d20131125-20161-1d0rjn9	0.011s
PASS
ok  	_/tmp/d20131125-20161-1d0rjn9	0.011s
PASS
ok  	_/tmp/d20131125-20161-1d0rjn9	0.011s

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

Недялко обнови решението на 12.11.2013 14:51 (преди над 4 години)

+package main
+
+import "fmt"
+
+type Header struct {
+ Format string
+ LineWidth int
+}
+
+type Color struct {
+ Red, Green, Blue byte
+}
+
+func (c Color) String() string {
+ return fmt.Sprintf("Red: %d, Green: %d, Blue: %d", c.Red, c.Green, c.Blue)
+}
+
+type Pixel struct {
+ c Color
+}
+
+func (p Pixel) Color() Color {
+ return p.c
+}
+
+type Image struct {
+ Width, Height int
+ Data []Pixel
+}
+
+func (i Image) InspectPixel(col, row int) Pixel {
+ return i.Data[row*i.Width+col]
+}
+
+func MakePixel(format string, pixelData []byte) Pixel {
+ var red, green, blue byte
+ var alpha float32 = 255
+
+ // TODO: parse the format string only once and return a
+ // closure that makes custom pixels according to that header
+ for i := range format {
+ switch {
+ case format[i] == 'R':
+ red = pixelData[i]
+ case format[i] == 'G':
+ green = pixelData[i]
+ case format[i] == 'B':
+ blue = pixelData[i]
+ case format[i] == 'A':
+ alpha = float32(pixelData[i])
+ }
+ }
+
+ red = byte(float32(red) * alpha / 255)
+ green = byte(float32(green) * alpha / 255)
+ blue = byte(float32(blue) * alpha / 255)
+
+ return Pixel{Color{red, green, blue}}
+}
+
+func ParseImage(data []byte, header Header) Image {
+ dataLength := len(data)
+ pixelDataLength := len(header.Format)
+
+ pixelCount := dataLength / pixelDataLength
+ imageWidth := header.LineWidth
+ imageHeight := pixelCount / imageWidth
+
+ var img = new(Image)
+ img.Data = make([]Pixel, imageWidth*imageHeight)
+ img.Width = imageWidth
+ img.Height = imageHeight
+
+ for i := 0; i < pixelCount; i++ {
+ img.Data[i] = MakePixel(header.Format, data[i*pixelDataLength:(i+1)*pixelDataLength])
+ }
+
+ return *img
+}