use gift filters to create aligned images

This commit is contained in:
Celogeek 2023-04-16 18:25:41 +02:00
parent 17d8161d99
commit a2eeda8479
Signed by: celogeek
SSH Key Fingerprint: SHA256:njNJLzoLQdbV9PC6ehcruRb0QnEgxABoCYZ+0+aUIYc
3 changed files with 67 additions and 5 deletions

View File

@ -0,0 +1,55 @@
package filters
import (
"image"
"image/draw"
"github.com/disintegration/gift"
)
const (
PositionCenter = iota
PositionLeft
PositionRight
)
func Position(viewWidth, viewHeight int, align int) gift.Filter {
return &positionFilter{
viewWidth, viewHeight, align,
}
}
type positionFilter struct {
viewWidth, viewHeight, align int
}
func (p *positionFilter) Bounds(srcBounds image.Rectangle) image.Rectangle {
return image.Rect(0, 0, p.viewWidth, p.viewHeight)
}
func (p *positionFilter) Draw(dst draw.Image, src image.Image, options *gift.Options) {
draw.Draw(dst, dst.Bounds(), image.White, dst.Bounds().Min, draw.Over)
srcBounds := src.Bounds()
left, top := (p.viewWidth-srcBounds.Dx())/2, (p.viewHeight-srcBounds.Dy())/2
if p.align == PositionLeft {
left = 0
}
if p.align == PositionRight {
left = p.viewWidth - srcBounds.Dx()
}
draw.Draw(
dst,
image.Rect(
left,
top,
p.viewWidth,
p.viewHeight,
),
src,
srcBounds.Min,
draw.Over,
)
}

View File

@ -21,6 +21,7 @@ func NewGift(options *ImageOptions) *gift.GIFT {
g.Add( g.Add(
filters.Resize(options.ViewWidth, options.ViewHeight, gift.LanczosResampling), filters.Resize(options.ViewWidth, options.ViewHeight, gift.LanczosResampling),
filters.Pixel(), filters.Pixel(),
filters.Position(options.ViewWidth, options.ViewHeight, filters.PositionCenter),
) )
return g return g
} }
@ -28,25 +29,30 @@ func NewGift(options *ImageOptions) *gift.GIFT {
func NewGiftSplitDoublePage(options *ImageOptions) []*gift.GIFT { func NewGiftSplitDoublePage(options *ImageOptions) []*gift.GIFT {
gifts := make([]*gift.GIFT, 2) gifts := make([]*gift.GIFT, 2)
rightFirst := options.Manga
gifts[0] = gift.New( gifts[0] = gift.New(
filters.CropSplitDoublePage(rightFirst), filters.CropSplitDoublePage(options.Manga),
) )
gifts[1] = gift.New( gifts[1] = gift.New(
filters.CropSplitDoublePage(!rightFirst), filters.CropSplitDoublePage(!options.Manga),
) )
for _, g := range gifts { for i, g := range gifts {
if options.Contrast != 0 { if options.Contrast != 0 {
g.Add(gift.Contrast(float32(options.Contrast))) g.Add(gift.Contrast(float32(options.Contrast)))
} }
if options.Brightness != 0 { if options.Brightness != 0 {
g.Add(gift.Brightness(float32(options.Brightness))) g.Add(gift.Brightness(float32(options.Brightness)))
} }
position := filters.PositionLeft
if (i == 1) == options.Manga {
position = filters.PositionRight
}
g.Add( g.Add(
filters.Resize(options.ViewWidth, options.ViewHeight, gift.LanczosResampling), filters.Resize(options.ViewWidth, options.ViewHeight, gift.LanczosResampling),
filters.Position(options.ViewWidth, options.ViewHeight, position),
) )
} }

View File

@ -226,6 +226,7 @@ func (e *ePub) LoadImages() ([]*Image, error) {
part := i + 1 part := i + 1
dst := image.NewGray(g.Bounds(src.Bounds())) dst := image.NewGray(g.Bounds(src.Bounds()))
g.Draw(dst, src) g.Draw(dst, src)
imageOutput <- &Image{ imageOutput <- &Image{
Id: img.Id, Id: img.Id,
Part: part, Part: part,