mirror of
				https://github.com/gohugoio/hugo.git
				synced 2024-05-11 05:54:58 +00:00 
			
		
		
		
	This commit `smart` as a new and default anchor in `Fill`.
So:
```html
{{ $image.Fill "200x200" }}
```
Is, with default configuration, the same as:
```html
{{ $image.Fill "200x200" "smart" }}
```
You can change this default in your `config.toml`:
```toml
[imaging]
[imaging]
resampleFilter = "box"
quality = 68
anchor = "Smart"
```
Fixes #4375
		
	
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2017-present The Hugo Authors. All rights reserved.
 | 
						|
//
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
// http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
 | 
						|
package resource
 | 
						|
 | 
						|
import (
 | 
						|
	"image"
 | 
						|
 | 
						|
	"github.com/disintegration/imaging"
 | 
						|
	"github.com/muesli/smartcrop"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	// Do not change.
 | 
						|
	smartCropIdentifier = "smart"
 | 
						|
 | 
						|
	// This is just a increment, starting on 1. If Smart Crop improves its cropping, we
 | 
						|
	// need a way to trigger a re-generation of the crops in the wild, so increment this.
 | 
						|
	smartCropVersionNumber = 1
 | 
						|
)
 | 
						|
 | 
						|
// Needed by smartcrop
 | 
						|
type imagingResizer struct {
 | 
						|
	filter imaging.ResampleFilter
 | 
						|
}
 | 
						|
 | 
						|
func (r imagingResizer) Resize(img image.Image, width, height uint) image.Image {
 | 
						|
	return imaging.Resize(img, int(width), int(height), r.filter)
 | 
						|
}
 | 
						|
 | 
						|
func newSmartCropAnalyzer(filter imaging.ResampleFilter) smartcrop.Analyzer {
 | 
						|
	return smartcrop.NewAnalyzer(imagingResizer{filter: filter})
 | 
						|
}
 | 
						|
 | 
						|
func smartCrop(img image.Image, width, height int, anchor imaging.Anchor, filter imaging.ResampleFilter) (*image.NRGBA, error) {
 | 
						|
 | 
						|
	if width <= 0 || height <= 0 {
 | 
						|
		return &image.NRGBA{}, nil
 | 
						|
	}
 | 
						|
 | 
						|
	srcBounds := img.Bounds()
 | 
						|
	srcW := srcBounds.Dx()
 | 
						|
	srcH := srcBounds.Dy()
 | 
						|
 | 
						|
	if srcW <= 0 || srcH <= 0 {
 | 
						|
		return &image.NRGBA{}, nil
 | 
						|
	}
 | 
						|
 | 
						|
	if srcW == width && srcH == height {
 | 
						|
		return imaging.Clone(img), nil
 | 
						|
	}
 | 
						|
 | 
						|
	smart := newSmartCropAnalyzer(filter)
 | 
						|
 | 
						|
	rect, err := smart.FindBestCrop(img, width, height)
 | 
						|
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	b := img.Bounds().Intersect(rect)
 | 
						|
 | 
						|
	cropped, err := imaging.Crop(img, b), nil
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	return imaging.Resize(cropped, width, height, filter), nil
 | 
						|
 | 
						|
}
 |