mirror of
https://github.com/celogeek/go-comic-converter.git
synced 2025-05-25 08:12:36 +02:00
do not enlarge smaller images
all width/height are computed based on viewport dimension. images will enlarge if smaller, and resize to fit if larger.
This commit is contained in:
parent
8b04cbc38f
commit
13103b0eba
@ -6,6 +6,7 @@ package epubimage
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Image struct {
|
type Image struct {
|
||||||
@ -72,24 +73,48 @@ func (i *Image) EPUBImgPath() string {
|
|||||||
// center by default.
|
// center by default.
|
||||||
// align to left or right if it's part of the splitted double page.
|
// align to left or right if it's part of the splitted double page.
|
||||||
func (i *Image) ImgStyle(viewWidth, viewHeight int, align string) string {
|
func (i *Image) ImgStyle(viewWidth, viewHeight int, align string) string {
|
||||||
marginW, marginH := float64(viewWidth-i.Width)/2, float64(viewHeight-i.Height)/2
|
relWidth, relHeight := i.RelSize(viewWidth, viewHeight)
|
||||||
|
marginW, marginH := float64(viewWidth-relWidth)/2, float64(viewHeight-relHeight)/2
|
||||||
|
|
||||||
|
style := []string{}
|
||||||
|
|
||||||
|
style = append(style, fmt.Sprintf("width:%dpx", relWidth))
|
||||||
|
style = append(style, fmt.Sprintf("height:%dpx", relHeight))
|
||||||
|
style = append(style, fmt.Sprintf("top:%.2f%%", marginH*100/float64(viewHeight)))
|
||||||
if align == "" {
|
if align == "" {
|
||||||
switch i.Position {
|
switch i.Position {
|
||||||
case "rendition:page-spread-left":
|
case "rendition:page-spread-left":
|
||||||
align = "right:0"
|
style = append(style, "right:0")
|
||||||
case "rendition:page-spread-right":
|
case "rendition:page-spread-right":
|
||||||
align = "left:0"
|
style = append(style, "left:0")
|
||||||
default:
|
default:
|
||||||
align = fmt.Sprintf("left:%.2f%%", marginW*100/float64(viewWidth))
|
style = append(style, fmt.Sprintf("left:%.2f%%", marginW*100/float64(viewWidth)))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
style = append(style, align)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Sprintf(
|
return strings.Join(style, "; ")
|
||||||
"width:%dpx; height:%dpx; top:%.2f%%; %s;",
|
}
|
||||||
i.Width,
|
|
||||||
i.Height,
|
func (i *Image) RelSize(viewWidth, viewHeight int) (relWidth, relHeight int) {
|
||||||
marginH*100/float64(viewHeight),
|
w, h := viewWidth, viewHeight
|
||||||
align,
|
srcw, srch := i.Width, i.Height
|
||||||
)
|
|
||||||
|
if w <= 0 || h <= 0 || srcw <= 0 || srch <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
wratio := float64(srcw) / float64(w)
|
||||||
|
hratio := float64(srch) / float64(h)
|
||||||
|
|
||||||
|
if wratio > hratio {
|
||||||
|
relWidth = w
|
||||||
|
relHeight = int(float64(srch)/wratio + 0.5)
|
||||||
|
} else {
|
||||||
|
relHeight = h
|
||||||
|
relWidth = int(float64(srcw)/hratio + 0.5)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
@ -1,48 +0,0 @@
|
|||||||
package epubimagefilters
|
|
||||||
|
|
||||||
import (
|
|
||||||
"image"
|
|
||||||
"image/draw"
|
|
||||||
|
|
||||||
"github.com/disintegration/gift"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Resize image by keeping aspect ratio.
|
|
||||||
// This will reduce or enlarge image to fit into the viewWidth and viewHeight.
|
|
||||||
func Resize(viewWidth, viewHeight int, resampling gift.Resampling) gift.Filter {
|
|
||||||
return &resizeFilter{
|
|
||||||
viewWidth, viewHeight, resampling,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type resizeFilter struct {
|
|
||||||
viewWidth, viewHeight int
|
|
||||||
resampling gift.Resampling
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *resizeFilter) Bounds(srcBounds image.Rectangle) image.Rectangle {
|
|
||||||
w, h := p.viewWidth, p.viewHeight
|
|
||||||
srcw, srch := srcBounds.Dx(), srcBounds.Dy()
|
|
||||||
|
|
||||||
if w <= 0 || h <= 0 || srcw <= 0 || srch <= 0 {
|
|
||||||
return image.Rect(0, 0, 0, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
wratio := float64(srcw) / float64(w)
|
|
||||||
hratio := float64(srch) / float64(h)
|
|
||||||
|
|
||||||
var dstw, dsth int
|
|
||||||
if wratio > hratio {
|
|
||||||
dstw = w
|
|
||||||
dsth = int(float64(srch)/wratio + 0.5)
|
|
||||||
} else {
|
|
||||||
dsth = h
|
|
||||||
dstw = int(float64(srcw)/hratio + 0.5)
|
|
||||||
}
|
|
||||||
|
|
||||||
return image.Rect(0, 0, dstw, dsth)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *resizeFilter) Draw(dst draw.Image, src image.Image, options *gift.Options) {
|
|
||||||
gift.Resize(dst.Bounds().Dx(), dst.Bounds().Dy(), p.resampling).Draw(dst, src, options)
|
|
||||||
}
|
|
@ -202,7 +202,7 @@ func (e *EPUBImageProcessor) transformImage(src image.Image, srcId int) []image.
|
|||||||
}
|
}
|
||||||
|
|
||||||
filters = append(filters,
|
filters = append(filters,
|
||||||
epubimagefilters.Resize(e.Image.View.Width, e.Image.View.Height, gift.LanczosResampling),
|
gift.ResizeToFit(e.Image.View.Width, e.Image.View.Height, gift.LanczosResampling),
|
||||||
epubimagefilters.Pixel(),
|
epubimagefilters.Pixel(),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -234,7 +234,7 @@ func (e *EPUBImageProcessor) transformImage(src image.Image, srcId int) []image.
|
|||||||
g := gift.New(splitFilter...)
|
g := gift.New(splitFilter...)
|
||||||
g.Add(
|
g.Add(
|
||||||
epubimagefilters.CropSplitDoublePage(b),
|
epubimagefilters.CropSplitDoublePage(b),
|
||||||
epubimagefilters.Resize(e.Image.View.Width, e.Image.View.Height, gift.LanczosResampling),
|
gift.ResizeToFit(e.Image.View.Width, e.Image.View.Height, gift.LanczosResampling),
|
||||||
)
|
)
|
||||||
dst := e.createImage(src, g.Bounds(src.Bounds()))
|
dst := e.createImage(src, g.Bounds(src.Bounds()))
|
||||||
g.Draw(dst, src)
|
g.Draw(dst, src)
|
||||||
|
@ -8,8 +8,6 @@
|
|||||||
<meta name="viewport" content="{{ .ViewPort }}"/>
|
<meta name="viewport" content="{{ .ViewPort }}"/>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div>
|
|
||||||
<img src="../{{ .ImagePath }}" alt="{{ .Title }}" style="{{ .ImageStyle }}"/>
|
<img src="../{{ .ImagePath }}" alt="{{ .Title }}" style="{{ .ImageStyle }}"/>
|
||||||
</div>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
Loading…
x
Reference in New Issue
Block a user