Я преобразовал pdf в jpeg, используя go-fitz, который дает мне список jpeg в каталоге. Я читаю список изображений из каталога, а затем пытаюсь объединить их в одно изображение. Изображение имеет тип jpeg и работает частично, если я просто использую страницы 1 и 2, используя индекс. Я хочу сшить изображения в формате PDF в формате JPEG обратно в одно изображение JPEG. Конечный результат кода генерирует одно изображение с первой страницей.
Golang, как объединять / добавлять изображения друг к другу
Если я использую индекс изображения 0 и 1, этот код работает. Но не работает в динамическом списке с моим кодом. Но у меня будет динамический список изображений, которые мне нужно собрать в одно изображение. Я предполагаю, что это как-то связано с конечным размером холста изображения и добавлением его на холст. Код заканчивается тем, что первая и последняя страницы в широком канве пропускаются, а остальные страницы пропускаются, когда я пытаюсь использовать стек поверх потока.
package converter
import (
"fmt"
"image"
"image/draw"
"image/jpeg"
"os"
"path/filepath"
"strings"
log "github.com/sirupsen/logrus"
)
func openAndDecode(imgPath string) image.Image {
img, err := os.Open(imgPath)
if err != nil {
log.Fatalf("Failed to open %s", err)
}
decoded, _, err := image.Decode(img)
if err != nil {
log.Fatalf("Failed to decode %s", err)
}
defer img.Close()
return decoded
}
// StichImages takes a directory of images and combine them into a single image
func StichImages(dirPath string) {
fileList := []string{}
decodedImages := []image.Image{}
err := filepath.Walk(dirPath, func(path string, f os.FileInfo, err error) error {
fileList = append(fileList, path)
return nil
})
if err != nil {
log.Fatal(err)
}
// If there is only one image in folder no need to stich
if len(fileList) == 1 {
return
}
for _, filePath := range fileList {
if strings.Contains(filePath, ".jpg") {
decodedImage := openAndDecode(filePath)
decodedImages = append(decodedImages, decodedImage)
}
}
outPutPath := filepath.Join(dirPath, "output.jpg")
if len(decodedImages) == 0 {
log.Error(fmt.Sprintf("No images found in: %s", dirPath))
}
//starting position of the second image (bottom left)
startingPoint := image.Point{}
finalImageCanvas := image.Rectangle{image.Point{0, 0}, decodedImages[0].Bounds().Max}
rgba := image.NewRGBA(finalImageCanvas)
for index, newImage := range decodedImages {
if index == 0 {
startingPoint = image.Point{newImage.Bounds().Dx(), 0}
draw.Draw(rgba, newImage.Bounds(), newImage, image.Point{0, 0}, draw.Src)
} else {
newImageRect := image.Rectangle{startingPoint, startingPoint.Add(newImage.Bounds().Size())}
finalImageCanvas = image.Rectangle{image.Point{0, 0}, newImageRect.Max}
draw.Draw(rgba, newImageRect, newImage, image.Point{0, 0}, draw.Src)
startingPoint = image.Point{newImageRect.Bounds().Dx(), 0}
}
}
out, err := os.Create(outPutPath)
if err != nil {
fmt.Println(err)
}
var opt jpeg.Options
opt.Quality = 80
jpeg.Encode(out, rgba, &opt)
}