溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么使用ChatGPT編寫一個(gè)Golang圖像壓縮函數(shù)

發(fā)布時(shí)間:2023-04-25 10:46:41 來(lái)源:億速云 閱讀:124 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“怎么使用ChatGPT編寫一個(gè)Golang圖像壓縮函數(shù)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

提出需求

我對(duì)ChatGPT提出了如下要求:

請(qǐng)幫我編寫一個(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)。

“怎么使用ChatGPT編寫一個(gè)Golang圖像壓縮函數(shù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI