}
d.colorType = d.tmp[9]
switch d.colorType {
+ case ctGrayscale:
+ d.image = image.NewGray(int(w), int(h))
case ctTrueColor:
d.image = image.NewRGBA(int(w), int(h))
case ctPaletted:
palette[i] = image.RGBAColor{d.tmp[3*i+0], d.tmp[3*i+1], d.tmp[3*i+2], 0xff}
}
d.image.(*image.Paletted).Palette = image.PalettedColorModel(palette)
- case ctTrueColor, ctTrueColorAlpha:
+ case ctGrayscale, ctTrueColor, ctTrueColorAlpha:
// As per the PNG spec, a PLTE chunk is optional (and for practical purposes,
// ignorable) for the ctTrueColor and ctTrueColorAlpha color types (section 4.1.2).
return nil
}
crc.Write(d.tmp[0:n])
switch d.colorType {
+ case ctGrayscale:
+ return UnsupportedError("grayscale transparency")
case ctTrueColor:
- return UnsupportedError("TrueColor transparency")
+ return UnsupportedError("truecolor transparency")
case ctPaletted:
p := d.image.(*image.Paletted).Palette
if n > len(p) {
bpp := 0 // Bytes per pixel.
maxPalette := uint8(0)
var (
+ gray *image.Gray
rgba *image.RGBA
- nrgba *image.NRGBA
paletted *image.Paletted
+ nrgba *image.NRGBA
)
switch d.colorType {
+ case ctGrayscale:
+ bpp = 1
+ gray = d.image.(*image.Gray)
case ctTrueColor:
bpp = 3
rgba = d.image.(*image.RGBA)
// Convert from bytes to colors.
switch d.colorType {
+ case ctGrayscale:
+ for x := 0; x < d.width; x++ {
+ gray.Set(x, y, image.GrayColor{cdat[x]})
+ }
case ctTrueColor:
for x := 0; x < d.width; x++ {
rgba.Set(x, y, image.RGBAColor{cdat[3*x+0], cdat[3*x+1], cdat[3*x+2], 0xff})
//"basn0g01", // bit depth is not 8
//"basn0g02", // bit depth is not 8
//"basn0g04", // bit depth is not 8
- //"basn0g08", // grayscale color model
+ "basn0g08",
//"basn0g16", // bit depth is not 8
"basn2c08",
//"basn2c16", // bit depth is not 8
var paletted *image.Paletted
cpm, _ := cm.(image.PalettedColorModel)
switch {
+ case cm == image.GrayColorModel:
+ io.WriteString(w, " using grayscale;\n")
case cm == image.RGBAColorModel:
io.WriteString(w, " using color;\n")
case cm == image.NRGBAColorModel:
io.WriteString(w, "IMAGE {\n pixels hex\n")
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
switch {
+ case cm == image.GrayColorModel:
+ for x := bounds.Min.X; x < bounds.Max.X; x++ {
+ gray := png.At(x, y).(image.GrayColor)
+ fmt.Fprintf(w, "%02x", gray.Y)
+ }
case cm == image.RGBAColorModel:
for x := bounds.Min.X; x < bounds.Max.X; x++ {
rgba := png.At(x, y).(image.RGBAColor)
bpp := 0 // Bytes per pixel.
var paletted *image.Paletted
switch ct {
+ case ctGrayscale:
+ bpp = 1
case ctTrueColor:
bpp = 3
case ctPaletted:
for y := b.Min.Y; y < b.Max.Y; y++ {
// Convert from colors to bytes.
switch ct {
+ case ctGrayscale:
+ for x := b.Min.X; x < b.Max.X; x++ {
+ c := image.GrayColorModel.Convert(m.At(x, y)).(image.GrayColor)
+ cr[0][x+1] = c.Y
+ }
case ctTrueColor:
for x := b.Min.X; x < b.Max.X; x++ {
// We have previously verified that the alpha value is fully opaque.
var e encoder
e.w = w
e.m = m
- e.colorType = uint8(ctTrueColorAlpha)
+ e.colorType = ctTrueColorAlpha
pal, _ := m.(*image.Paletted)
if pal != nil {
e.colorType = ctPaletted
- } else if opaque(m) {
- e.colorType = ctTrueColor
+ } else {
+ switch m.ColorModel() {
+ case image.GrayColorModel:
+ e.colorType = ctGrayscale
+ default:
+ if opaque(m) {
+ e.colorType = ctTrueColor
+ }
+ }
}
_, e.err = io.WriteString(w, pngHeader)