利用ChatGPT編寫(xiě)一個(gè)Golang圖像壓縮函數(shù)
最近在使用Wails開(kāi)發(fā)ImgURL客戶端時(shí),需要對(duì)圖片進(jìn)行壓縮再上傳,為了提高效率,節(jié)省時(shí)間,這次直接讓ChatGPT來(lái)幫我完成這個(gè)需求。

提出需求
我對(duì)ChatGPT提出了如下要求:
請(qǐng)幫我編寫(xiě)一個(gè)能夠接收?qǐng)D片路徑并進(jìn)行壓縮的Golang函數(shù)。該函數(shù)需要支持jpg和png格式的圖片,并且會(huì)校驗(yàn)MIME類型。如果圖片類型不是jpg或png,則函數(shù)不會(huì)進(jìn)行處理。壓縮后的圖片路徑與原路徑相同,比如
/tmp/1.png經(jīng)過(guò)壓縮后依然為/tmp/1.png。函數(shù)的返回值為err。
第一次給我返回的代碼中并沒(méi)有去校驗(yàn)MIME類型,于是我再次讓他跟進(jìn)需求:
您似乎不是根據(jù)MIME類型來(lái)判斷而是根據(jù)擴(kuò)展名來(lái)判斷的?請(qǐng)根據(jù)MIME類型來(lái)判斷,如果不是匹配的MIME類型,返回nil,壓縮后圖片路徑不改變,比如
/tmp/1.png壓縮后的圖片路徑依然為/tmp/1.png
這次給的代碼看起來(lái)沒(méi)問(wèn)題,但實(shí)際運(yùn)行的時(shí)候并沒(méi)有壓縮圖片,原來(lái)MIME類型判斷錯(cuò)了,繼續(xù)提問(wèn):
為什么我調(diào)用函數(shù)后圖片大小沒(méi)有任何變化?
ChatGPT勇于承認(rèn)錯(cuò)誤:
抱歉給您帶來(lái)困擾。我發(fā)現(xiàn)在代碼中有一個(gè)錯(cuò)誤,http.DetectContentType 方法應(yīng)該接收文件的前512個(gè)字節(jié)而不是文件路徑。下面是修改后的 compressImage 函數(shù)。
這次給的代碼未做任何修改,可以成功運(yùn)行并壓縮圖像。
package main
import (
"errors"
"image"
"image/jpeg"
"image/png"
"mime"
"net/http"
"os"
)
func compressImage(imagePath string) error {
file, err := os.Open(imagePath)
if err != nil {
return err
}
defer file.Close()
// 讀取文件的前512個(gè)字節(jié)
buffer := make([]byte, 512)
_, err = file.Read(buffer)
if err != nil {
return err
}
file.Seek(0, 0)
// 根據(jù)MIME類型檢查
contentType := http.DetectContentType(buffer)
var img image.Image
var format string
switch contentType {
case "image/jpeg":
img, err = jpeg.Decode(file)
format = "jpeg"
case "image/png":
img, err = png.Decode(file)
format = "png"
default:
return nil
}
if err != nil {
return err
}
// 關(guān)閉并重新打開(kāi)文件進(jìn)行壓縮
file.Close()
file, err = os.OpenFile(imagePath, os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {
return err
}
defer file.Close()
var opt jpeg.Options
opt.Quality = 75 // 設(shè)置壓縮質(zhì)量為75
switch format {
case "jpeg":
err = jpeg.Encode(file, img, &opt)
case "png":
encoder := png.Encoder{CompressionLevel: png.BestCompression}
err = encoder.Encode(file, img)
}
return err
}
func main() {
imagePath := "/tmp/1.png"
err := compressImage(imagePath)
if err != nil {
println("Error compressing image:", err.Error())
} else {
println("Image compressed successfully")
}
}并且對(duì)代碼做出了解釋:
這個(gè)函數(shù)中,JPEG圖片采用有損壓縮,而PNG圖片采用無(wú)損壓縮。
對(duì)于JPEG圖片,壓縮質(zhì)量設(shè)置為75(范圍是1-100,數(shù)值越高,質(zhì)量越好,但文件大小也越大)。
對(duì)于PNG圖片,這個(gè)函數(shù)使用了最佳壓縮級(jí)別(png.BestCompression)。這會(huì)進(jìn)行無(wú)損壓縮,保留圖像的所有原始信息,但可能會(huì)導(dǎo)致壓縮時(shí)間較長(zhǎng)。
結(jié)語(yǔ)
正確使用ChatGPT確實(shí)能有效提高效率,但不能完全依賴ChatGPT。還需要自己的辨別能力,因?yàn)镃hatGPT給出的答案也不完全正確。我們需要自己辨別和加以引導(dǎo),才能得到正確的答案。將ChatGPT視為輔助工具則非常不錯(cuò)。此外,我們應(yīng)該分辨出哪些問(wèn)題能夠由ChatGPT回答,哪些問(wèn)題需要我們自己解決。
到此這篇關(guān)于利用ChatGPT編寫(xiě)一個(gè)Golang圖像壓縮函數(shù)的文章就介紹到這了,更多相關(guān)Golang圖像壓縮函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Golang time包中的time.Duration類型
在日常開(kāi)發(fā)過(guò)程中,會(huì)頻繁遇到對(duì)時(shí)間進(jìn)行操作的場(chǎng)景,使用 Golang 中的 time 包可以很方便地實(shí)現(xiàn)對(duì)時(shí)間的相關(guān)操作,本文講解一下 time 包中的 time.Duration 類型,需要的朋友可以參考下2023-07-07
一些關(guān)于Go程序錯(cuò)誤處理的相關(guān)建議
錯(cuò)誤處理在每個(gè)語(yǔ)言中都是一項(xiàng)重要內(nèi)容,眾所周知,通常寫(xiě)程序時(shí)遇到的分為異常與錯(cuò)誤兩種,Golang中也不例外,這篇文章主要給大家介紹了一些關(guān)于Go程序錯(cuò)誤處理的相關(guān)建議,需要的朋友可以參考下2021-09-09
Go語(yǔ)言中利用http發(fā)起Get和Post請(qǐng)求的方法示例
這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中利用http發(fā)起Get和Post請(qǐng)求的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
Golang使用Gin創(chuàng)建Restful API的實(shí)現(xiàn)
本文主要介紹了Golang使用Gin創(chuàng)建Restful API的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

