Added patch to remove borders from images
This commit is contained in:
parent
d763af3747
commit
85a0b60d62
@ -19,8 +19,8 @@
|
|||||||
margin-bottom 1rem
|
margin-bottom 1rem
|
||||||
|
|
||||||
.character-image-large
|
.character-image-large
|
||||||
width 225px
|
width 219px
|
||||||
height 350px
|
height 344px
|
||||||
border-radius ui-element-border-radius
|
border-radius ui-element-border-radius
|
||||||
box-shadow shadow-light
|
box-shadow shadow-light
|
||||||
|
|
||||||
|
159
patches/remove-character-borders/remove-character-borders.go
Normal file
159
patches/remove-character-borders/remove-character-borders.go
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"image"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/animenotifier/arn"
|
||||||
|
"github.com/fatih/color"
|
||||||
|
|
||||||
|
icolor "image/color"
|
||||||
|
_ "image/gif"
|
||||||
|
_ "image/jpeg"
|
||||||
|
"image/png"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
defer color.Green("Finished.")
|
||||||
|
defer arn.Node.Close()
|
||||||
|
defer time.Sleep(time.Second)
|
||||||
|
|
||||||
|
characters := arn.FilterCharacters(func(character *arn.Character) bool {
|
||||||
|
return character.HasImage()
|
||||||
|
})
|
||||||
|
|
||||||
|
for index, character := range characters {
|
||||||
|
fmt.Printf("[%d / %d] %s\n", index+1, len(characters), character)
|
||||||
|
process(character)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func process(character *arn.Character) {
|
||||||
|
file, err := os.Open(path.Join(arn.Root, "images", "characters", "original", character.ID+character.Image.Extension))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
color.Red(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
img, format, err := image.Decode(file)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
color.Red(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
newImg := removeBorders(img)
|
||||||
|
|
||||||
|
fmt.Println(img.Bounds().Dx(), img.Bounds().Dy(), format)
|
||||||
|
fmt.Println(newImg.Bounds().Dx(), newImg.Bounds().Dy())
|
||||||
|
|
||||||
|
buffer := bytes.NewBuffer(nil)
|
||||||
|
err = png.Encode(buffer, newImg)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
color.Red(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
char, _ := arn.GetCharacter("EI3HwrmiRm")
|
||||||
|
char.SetImageBytes(buffer.Bytes())
|
||||||
|
char.Save()
|
||||||
|
}
|
||||||
|
|
||||||
|
func diffAbs(a uint32, b uint32) uint32 {
|
||||||
|
if a > b {
|
||||||
|
return a - b
|
||||||
|
}
|
||||||
|
|
||||||
|
return b - a
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeBorders(img image.Image) image.Image {
|
||||||
|
const maxBorderLength = 3
|
||||||
|
|
||||||
|
width := img.Bounds().Dx()
|
||||||
|
height := img.Bounds().Dy()
|
||||||
|
|
||||||
|
borderLength := 0
|
||||||
|
|
||||||
|
for ; borderLength < maxBorderLength; borderLength++ {
|
||||||
|
edgeColors := []icolor.Color{}
|
||||||
|
|
||||||
|
// Top edge
|
||||||
|
for x := borderLength; x < width-borderLength*2; x++ {
|
||||||
|
c := img.At(x, borderLength)
|
||||||
|
edgeColors = append(edgeColors, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bottom edge
|
||||||
|
for x := borderLength; x < width-borderLength*2; x++ {
|
||||||
|
c := img.At(x, height-borderLength-1)
|
||||||
|
edgeColors = append(edgeColors, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Left edge
|
||||||
|
for y := borderLength; y < height-borderLength*2; y++ {
|
||||||
|
c := img.At(borderLength, y)
|
||||||
|
edgeColors = append(edgeColors, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Right edge
|
||||||
|
for y := borderLength; y < height-borderLength*2; y++ {
|
||||||
|
c := img.At(width-borderLength-1, y)
|
||||||
|
edgeColors = append(edgeColors, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if all edge colors are similar.
|
||||||
|
// Find average color first.
|
||||||
|
totalR := uint64(0)
|
||||||
|
totalG := uint64(0)
|
||||||
|
totalB := uint64(0)
|
||||||
|
|
||||||
|
for _, c := range edgeColors {
|
||||||
|
r, g, b, _ := c.RGBA()
|
||||||
|
totalR += uint64(r)
|
||||||
|
totalG += uint64(g)
|
||||||
|
totalB += uint64(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
averageR := uint32(totalR / uint64(len(edgeColors)))
|
||||||
|
averageG := uint32(totalG / uint64(len(edgeColors)))
|
||||||
|
averageB := uint32(totalB / uint64(len(edgeColors)))
|
||||||
|
|
||||||
|
const tolerance = 11000
|
||||||
|
|
||||||
|
// Check if the colors are close to the average color
|
||||||
|
notSimilarCount := 0
|
||||||
|
|
||||||
|
for _, c := range edgeColors {
|
||||||
|
r, g, b, _ := c.RGBA()
|
||||||
|
|
||||||
|
if diffAbs(r, averageR) > tolerance || diffAbs(g, averageG) > tolerance || diffAbs(b, averageB) > tolerance {
|
||||||
|
notSimilarCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if notSimilarCount >= 5 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newWidth := width - borderLength*2
|
||||||
|
newHeight := height - borderLength*2
|
||||||
|
newImg := image.NewNRGBA(image.Rect(0, 0, newWidth, newHeight))
|
||||||
|
|
||||||
|
for x := 0; x < newWidth; x++ {
|
||||||
|
for y := 0; y < newHeight; y++ {
|
||||||
|
newImg.Set(x, y, img.At(borderLength+x, borderLength+y))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newImg
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user