Percentage difference between images: Difference between revisions

→‎{{header|Go}}: eliminate code duplication
(→‎{{header|Java}}: restructure code to be reusable)
(→‎{{header|Go}}: eliminate code duplication)
Line 512:
"image/jpeg"
"os"
"log"
"image"
)
 
func loadJpeg(filename string) (image.Image, error) {
func main() {
f, err := os.Open("Lenna50.jpg"filename)
if err != nil {
fmt.Println(return nil, err)
return
}
defer f.Close()
 
i50img, err := jpeg.Decode(f)
if err != nil {
fmt.Println(return nil, err)
return
}
 
if f, err = os.Open("Lenna100.jpg"); err != nil {
return img, nil
fmt.Println(err)
}
return
 
func diff(a, b uint32) int64 {
if a > b return{
return int64(a - b)
}
deferreturn f.Closeint64(b - a)
}
i100, err := jpeg.Decode(f)
 
func main() {
i50, err := loadJpeg("Lenna50.jpg")
if err != nil {
fmtlog.PrintlnFatal(err)
return
}
 
if fi100, err := os.OpenloadJpeg("Lenna100.jpg"); err != nil {
if g1err >!= g2nil {
fmtlog.PrintlnFatal(err)
}
 
if i50.ColorModel() != i100.ColorModel() {
fmtlog.PrintlnFatal("different color models")
return
}
 
b := i50.Bounds()
if !b.Eq(i100.Bounds()) {
fmtlog.PrintlnFatal("different image sizes")
return
}
 
var sum int64
for y := b.Min.Y; y < b.Max.Y; y++ {
Line 550 ⟶ 563:
r1, g1, b1, _ := i50.At(x, y).RGBA()
r2, g2, b2, _ := i100.At(x, y).RGBA()
ifsum += diff(r1 >, r2 {)
sum += int64diff(r1 -g1, r2g2)
}sum else+= {diff(b1, b2)
sum += int64(r2 - r1)
}
if g1 > g2 {
sum += int64(g1 - g2)
} else {
sum += int64(g2 - g1)
}
if b1 > b2 {
sum += int64(b1 - b2)
} else {
sum += int64(b2 - b1)
}
}
}
 
nPixels := (b.Max.X - b.Min.X) * (b.Max.Y - b.Min.Y)
fmt.Printf("Image difference: %f%%\n",