Skip to content

image/gif: transparency lost when encoding a wrapped *image.Paletted #30995

@splace

Description

@splace

go 1.12.1 linux/amd64

What did you do?

package main

import "image"
import "image/png"
import "image/gif"
import "os"
import "encoding/base64"
import "strings"


type offsetImage struct{
	image.Image
	Rect image.Rectangle	
}

func (i offsetImage) Bounds() image.Rectangle{
	return i.Rect
}

func main() {
	tgif:=`R0lGODlhAAGAAPcAAAAAAP///1UATQBFAE4AVABTAFwAUABJAFIAQQBUAEUAIABGAEwAQQBHAC4A
RwBJAEYAAAAAAG6PX0oAAEcAdCALAB0LvxaYj4Y4bo9fSgAAAAAAAAAAAAAAAAAABvBWAMzvVgAS
P/e/AwAAAPdB97+QlPy/+c33v5CU/L8I9FYAA/BWAAAAAACs71YAAAAAAM5EWABfgfu/4hP3v2cB
AADFEve/AGlWADBVcNDGL/m/4hP3v2cBAADFEve/oHEAAAgAAAAoUfe/A0MAAAj0VgAAAAAA3AFp
AAAAAADMRFgACAAARkFUMzIA8FZDOlwAAAgAAACw8lYAAAAAAMSN+L8AAgAAfPBWACCx8n9Y8FYA
5KlngVQVQAAwVXDQWPBWAA6h978ms/e/AABAAAAAAAADAAAAWBVAACAAAABUFUAAwPJWANsU8n8A
AEAAAAAAAFgVQAAIFfJ/DOD8f1gVQABxFfJ/WBVAAAp09H9YFUAAAAAAAAQBAACxc/R/sPJWABT3
VgAAAAAAIAAAADs297/MBAAARwAAAAAAAAAy8VYAHwAAACsRQABS91YA/PBWAF+B+78EFLGBAAIA
AFL3VgArEUAAHwAAAD8AsYEw8VYABBSxgT8AsYEU91YACBFAAEwRQAA48VYAQdH3vwQUsYEU91YA
VPdWAAwRQABAAAAAPwCxgTDxVgAAAgAAQAAAABT3VgAAAAAARPFWAAACAABg8VYAnyj0fwAAAAB4
8VYA5KlngQgRQAAwVXDQePFWAA6h978ms/e/AABAAAAAAAAfAAAADBFAAOj0VgADAAAAAAAAgEH/
97/A8lYATFBUAAMAAAAAAAAAAQAAAAwRQABxFfJ/DBFAAGtz9H8MEUAAFPdWAAAAAAAgAAAAQzpc
TXkgRG9jdW1lbnRzXHBpcmF0ZSBmbGFnLmdpZgAU8lYAjAAAANwOUABEAAAAAwAAAAAAAAAs8lYA
tBEAAHg5aYEgAAAAoKP3vwBgYIGYOWmBtBEAAAAAAAAMYGCBAGBggSH5BAEAAAEALAAAAAAAAYAA
AAj/AAMIHEiwoMGDCBMqXMiwocOHECNKnEixokWCVTJe3Mixo8ePIEOKVJhR48iTKFOqXMnSYMmX
LWPKnEmz5subVWrq3MmzJ0ScN30KHUqUJtCjRZMqXXrxKFCmUKNKPei06tSrWIdW3Zq1q9eYW8N+
HUsWZNizJsuqXesQ7Vm2cONSdetWrt21dOne3fs1r1++gKX6HZwzsGGihAcfXtwzsWPGkME6Thy5
csrJmC1r/oi58+bPFjuLBk36p+jThUurdol69OrXA1vLhq1atm3aoG3rxq1Zt++0vA3/9h188fDj
xfkeR57c7vLnzeE+n546el/q0K1fx05dO1bu3L1PNQVPXjxT8ujNJ0XPXr1W9vCru58ZH/58nfXz
35ecv/7+lf0F+B9KARYo34AcGVgggpwpqCCDxU05+CCEFEloIYURWajhgRjOtaGEHS704Yghsjai
hiUWdOKKKa7oYoguxohhjDQCd1+NNCKI44437ojjfD4GaV6QRHLIW5FEWofkksUtyeSRTjpJW5RU
vkbllbVdqaWRxm2J5WZehllZmGRCRuaZXZ6JJmBqtslmm3ByOVacccpF551s3amnnILtieecfvrZ
VaCCZkXooeMdiihUijZ6XqOQ8klfpI4iRimlPl16aWOaaopfp6BOCmqnMo1qqo0jnXqqSqq2p3pS
q7CKBOusZs1qq6QN3WprgrrqWlGvwE4E7LAZDmtsW8Yey1CyzKIaW7PMIgTttCpOS61A1tJaUmwe
ZqtnANtiiytJ3m4pLn/lkgjuuEal2966qbG7nrutwcttmvQ6ZS+2GK2WLbyFpSWvlbuue2+KABca
rrMIi2juwgM3XCyLEPcrsU0LhgvuxYkOt+/GHNupmMYChxwZUgbza/KRK7fs8sswqxUQADs=`

	i,_,err:=image.Decode(base64.NewDecoder(base64.StdEncoding, strings.NewReader(tgif)))

	if err!=nil{panic(err)}

	w,_:= os.Create("1.png")
	png.Encode(w,i)
	w,_= os.Create("1.gif")
	gif.Encode(w,i,nil)

	i2:=offsetImage{i,i.Bounds()}   // no offset, same image

	w,_= os.Create("2.png")
	png.Encode(w,i2)
	w,_= os.Create("2.gif")
	gif.Encode(w,i2,nil)
	
}

What did you expect to see?

images the same

What did you see instead?

gif has transparency converted to black, png retains origin transparency.

output:

  • 1
  • 1
  • 2
  • 2

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions