Как нарисовать прямоугольник с заливкой на jpeg, если заданы значения в два пикселя, например, для: - pt1 (0,0) и pt2 (480, 240)? - PullRequest
0 голосов
/ 11 октября 2019

Я хочу открыть jpeg-файл с localdisk и нарисовать на нем заполненную прямоугольную рамку в Go, если я дам два значения точек в пикселях, такие как pt1 (0,0) и pt2 (480, 240)

1 Ответ

1 голос
/ 11 октября 2019

Посмотрите здесь . Вам необходимо декодировать изображение из JPEG, установить черные пиксели в вашем прямоугольнике, а затем перекодировать в JPEG.

Вот пример кода, он работает, если изображение находится в той же папке, что и исполняемый файл. и вы даете путь, как myimg.jpg:

package main

import (
    "fmt"
    "image"
    "image/color"
    "image/jpeg"
    "log"
    "os"
)

func main() {
    err := addBlackRectangle("myimg.jpg", 500, 500, 1000, 1000)
    if err != nil {
        log.Fatal(err)
    }
}

func addBlackRectangle(imgPath string, x1, y1, x2, y2 int) (err error) {
    r, err := os.Open(imgPath)
    if err != nil {
        return
    }
    img, err := jpeg.Decode(r)
    if err != nil {
        return
    }

    rect1 := img.Bounds()
    rect2 := image.Rect(x1, y1, x2, y2)

    if !rect2.In(rect1) {
        err = fmt.Errorf("error: rectangle outside image")
        return
    }

    rgba := image.NewRGBA(rect1)
    for x := rect1.Min.X; x <= rect1.Max.X; x++ {
        for y := rect1.Min.Y; y <= rect1.Max.Y; y++ {
            p := image.Pt(x, y)
            if p.In(rect2) {
                rgba.Set(x, y, color.Black)
            } else {
                rgba.Set(x, y, img.At(x, y))
            }
        }
    }

    outputFile := "rect-" + imgPath
    w, err := os.Create(outputFile)
    defer w.Close()

    err = jpeg.Encode(w, rgba, nil)
    return
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...