Utwórz nowy pusty obraz (NewRGBA), który ma wystarczająco duże krawędzie, aby pomieścić oba obrazy. Następnie użyj metody Draw
, aby narysować każdy obraz na odpowiednich częściach tego nowego dużego obrazu.
Oto kroki z kodem.
Załaduj dwa obrazy.
imgFile1, err := os.Open("test1.jpg")
imgFile2, err := os.Open("test2.jpg")
if err != nil {
fmt.Println(err)
}
img1, _, err := image.Decode(imgFile1)
img2, _, err := image.Decode(imgFile2)
if err != nil {
fmt.Println(err)
}
Narysujmy drugi obraz po prawej stronie pierwszego obrazu. Punktem wyjścia powinno być więc (w, 0)
, gdzie w
jest szerokością pierwszego obrazu. Dolny prawy punkt pierwszego obrazu będzie dolnym lewym punktem drugiego.
//starting position of the second image (bottom left)
sp2 := image.Point{img1.Bounds().Dx(), 0}
Powinien znajdować się w prostokątu wystarczająco dużym, aby go pomieścić.
//new rectangle for the second image
r2 := image.Rectangle{sp2, sp2.Add(img2.Bounds().Size())}
Teraz utwórz duży prostokąt, który będzie wystarczająco szeroki, aby pomieścić oba obrazy.
//rectangle for the big image
r := image.Rectangle{image.Point{0, 0}, r2.Max}
Uwaga Ten duży obraz będzie miał wysokość drugiego obrazu. Jeśli pierwszy obraz jest wyższy, zostanie przycięty.
Utwórz nowy obraz.
rgba := image.NewRGBA(r)
Teraz można wyciągnąć dwa obrazy w tym nowym obrazie
draw.Draw(rgba, img1.Bounds(), img1, image.Point{0, 0}, draw.Src)
draw.Draw(rgba, r2, img2, image.Point{0, 0}, draw.Src)
Ponieważ stworzyliśmy r2
więc jej na prawo od pierwszego obrazu, drugi obraz zostanie sporządzony w prawo.
Wreszcie można go wyeksportować.
out, err := os.Create("./output.jpg")
if err != nil {
fmt.Println(err)
}
var opt jpeg.Options
opt.Quality = 80
jpeg.Encode(out, rgba, &opt)
Jakie masz problemy? Czego spróbowałeś do tej pory? W każdym razie, ogólną zasadą jest utworzenie nowego, dużego obrazu docelowego, a następnie skopiowanie pikseli ze zdjęć źródłowych do obrazu docelowego. – Aedolon
Cóż, do tej pory mogę pobierać dane pikseli z png i tworzyć nowe RGBA, a następnie dekodować je wewnętrznie jako png, które przechodzę do OpenGL. Jednak nie jestem całkiem pewien, jak wziąć to "zdekodowane" dane png, które odczytałem z pliku .png i skopiować/utworzyć większy obraz z tego – efel