Convert, Resize, Quality
sourcePath := "original.png"
const (
  imageWidth = 160 // px
  jpegQuality = 50 // 50%
)
// read the source path
source_image_bytes, err := os.ReadFile(sourcePath)
if err != nil {
  log.Printf("error opening local source image: %v", err)
  return
}
// content type detection on original asset
contentType := http.DetectContentType(source_image_bytes)
// convert image to jpeg when the content type is png
if contentType == "image/png" {
  // Decode the PNG image bytes
  source_img_data, err := png.Decode(bytes.NewReader(source_image_bytes))
  if err != nil {
    log.Printf("error decoding png image: %v", err)
    return
  }
  // convert to jpeg
    // initialize a new buffer to store the jpeg image
  conversion_buffer := new(bytes.Buffer)
    // export the decoded image to jpeg
  // Quality can be dropped or adjusted here
  jpeg.Encode(conversion_buffer, source_img_data, &jpeg.Options{Quality: 95})
  // decode to convert buffer to image in memory
  final_conversion_img, err := imaging.Decode(conversion_buffer)
  if err != nil {
    log.Printf("error decoding buffer to an image in memory: %v", err)
    return
  }
  // save the converted asset to file path
  imaging.Save(final_conversion_img, "output.jpeg")
}
// Resize 
// resize will always run to create new file w/resize (thumbnail)
// resize to 160px (standard thumbnail) using imaging.Resize
resized_image_160 := imaging.Resize(source_img_data, imageWidth, imageWidth, imaging.Lanczos)
// save the image with only the resize operation
imaging.Save(resized_image_160, "resized_160.jpeg")