Sunday, October 5, 2025
HomeGolangIs picture/draw thread protected? - Getting Assist

Is picture/draw thread protected? – Getting Assist


// CompositeImage numSizeRatio is num + '#' size_ratio
func CompositeImage(numSizeRatio string, imageUrls []string) ([]byte, error) {
	compositeImageParameter := CompositeImageParameterMap[numSizeRatio]
	basemap := picture.NewRGBA(picture.Rect(0, 0, compositeImageParameter.BaseImageWidth, compositeImageParameter.BaseImageHeight))
	var wg sync.WaitGroup
	for i := 0; i < len(imageUrls); i++ {
		wg.Add(1)
		go func(i int) {
			defer func() {
				if err := recuperate(); err != nil {
					log.Errorf("panic stack: %s", string(debug.Stack()))
					log.Error("CompositeImage panic:", err)
				}
				wg.Executed()
			}()
			imageBytes, err := util.GetRaw(imageUrls[i])
			if err != nil {
				log.Errorf("GetRaw picture %d error: %v", i, err)
				return
			}

			buffer := bytes.NewBuffer(imageBytes)
			imageDecode, err := webp.Decode(buffer)
			if err != nil {
				imageDecode, _, err = picture.Decode(bytes.NewBuffer(imageBytes))
				if err != nil {
					log.Errorf("Decode picture %d error: %v", i, err)
					return
				}
			}
			draw.Draw(basemap, picture.Rect(compositeImageParameter.Offset[i][0], compositeImageParameter.Offset[i][1], compositeImageParameter.Offset[i][2], compositeImageParameter.Offset[i][3]),
				imageDecode, imageDecode.Bounds().Min, draw.Over)
		}(i)
	}
	wg.Wait()

	outputImageBytes := bytes.NewBuffer([]byte{})
	if err := png.Encode(outputImageBytes, basemap); err != nil {
		return nil, errors.Wrap(err, "png Encode error")
	}

	return outputImageBytes.Bytes(), nil
}

I exploit go take a look at -race. It doesn’t have errors.

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments