3 回答
TA贡献1712条经验 获得超3个赞
我将回答我自己的问题,以便对其他 Go 新手有所帮助。
阅读这两篇文章对我了解如何在 Go 中裁剪图像有很大帮助。不需要第三个库。您决定如何使用点和矩形裁剪图像,这是一种非常简洁的方法。
http://blog.golang.org/go-image-package
http://blog.golang.org/go-imagedraw-package
TA贡献1802条经验 获得超4个赞
这是一个裁剪图像的简单程序。如果在给定矩形之外切掉图像。
package main
import (
"fmt"
"image"
"log"
"os"
"image/png"
)
func main() {
if err := run(); err != nil {
log.Fatalln(err)
}
}
func run() error {
img, err := readImage("pic.png")
if err != nil {
return err
}
// I've hard-coded a crop rectangle, start (0,0), end (100, 100).
img, err = cropImage(img, image.Rect(0, 0, 100, 100))
if err != nil {
return err
}
return writeImage(img, "pic-cropped.png")
}
// readImage reads a image file from disk. We're assuming the file will be png
// format.
func readImage(name string) (image.Image, error) {
fd, err := os.Open("pic.png")
if err != nil {
return nil, err
}
defer fd.Close()
// image.Decode requires that you import the right image package. We've
// imported "image/png", so Decode will work for png files. If we needed to
// decode jpeg files then we would need to import "image/jpeg".
//
// Ignored return value is image format name.
img, _, err := image.Decode(fd)
if err != nil {
return nil, err
}
return img, nil
}
// cropImage takes an image and crops it to the specified rectangle.
func cropImage(img image.Image, crop image.Rectangle) (image.Image, error) {
type subImager interface {
SubImage(r image.Rectangle) image.Image
}
// img is an Image interface. This checks if the underlying value has a
// method called SubImage. If it does, then we can use SubImage to crop the
// image.
simg, ok := img.(subImager)
if !ok {
return nil, fmt.Errorf("image does not support cropping")
}
return simg.SubImage(crop), nil
}
// writeImage writes an Image back to the disk.
func writeImage(img image.Image, name string) error {
fd, err := os.Create(name)
if err != nil {
return err
}
defer fd.Close()
return png.Encode(fd, img)
}
TA贡献1871条经验 获得超8个赞
在这个答案中有更好的解释。SubImage 方法是为大多数图像格式实现的(似乎除了Uniform)。由于它不属于主界面,因此您需要对其进行断言才能使用它。
package main
import (
"fmt"
"image"
"image/jpeg"
"log"
"os"
)
func main() {
image_file, err := os.Open("somefile.jpeg")
if err != nil {
log.Fatal(err)
}
my_image, err := jpeg.Decode(image_file)
if err != nil {
log.Fatal(err)
}
my_sub_image := my_image.(interface {
SubImage(r image.Rectangle) image.Image
}).SubImage(image.Rect(0, 0, 10, 10))
output_file, outputErr := os.Create("output.jpeg")
if outputErr != nil {
log.Fatal(outputErr)
}
jpeg.Encode(output_file, my_sub_image, nil)
}
- 3 回答
- 0 关注
- 256 浏览
添加回答
举报