golangで画像を加工する方法

WBOY
リリース: 2023-05-15 10:05:37
オリジナル
1886 人が閲覧しました

インターネットの急速な発展に伴い、画像処理は Web 開発において避けられない部分となっており、Golang も例外ではありません。 Golang には、標準ライブラリの画像パッケージ、サードパーティ ライブラリの goimage、imagick など、画像処理用の非常に豊富なツール セットがすでにあります。

この記事では、読者が Golang で画像を処理する方法を理解できるように、Golang 画像処理の方法とテクニックを詳細に紹介します。

1. Golang 標準ライブラリの画像パッケージを使用する

画像パッケージは Golang で提供される標準画像操作ライブラリで、主に PNG などの一般的な画像ファイル形式を処理するために使用されます。 、JPEG、BMP、GIFなどの形式。画像ファイルのデコード、エンコード、トリミング、スケーリング、回転、変換などの機能を実装できる基本的なインターフェイスと関数のセットを提供します。

画像パッケージに基づいて画像スケーリング関数を実装する方法を見てみましょう:

package main

import (
    "image"
    "image/jpeg"
    "os"
)

func main() {
    // 读取源图片文件
    file, err := os.Open("source.jpg")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 解码源图片文件
    img, _, err := image.Decode(file)
    if err != nil {
        panic(err)
    }

    // 计算新图片尺寸
    newWidth := 640
    newHeight := (newWidth * int(img.Bounds().Dy())) / int(img.Bounds().Dx())

    // 缩放图片
    resized := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight))
    if err := resize(resized, img); err != nil {
        panic(err)
    }

    // 保存新图片文件
    newFile, err := os.Create("resized.jpg")
    if err != nil {
        panic(err)
    }
    defer newFile.Close()

    // 编码新图片
    if err := jpeg.Encode(newFile, resized, &jpeg.Options{Quality: 80}); err != nil {
        panic(err)
    }
}

// 缩放图片函数
func resize(dst *image.RGBA, src image.Image) error {
    sw, sh := src.Bounds().Dx(), src.Bounds().Dy()
    dw, dh := dst.Bounds().Dx(), dst.Bounds().Dy()
    scaleW, scaleH := float64(sw)/float64(dw), float64(sh)/float64(dh)
    if scaleW > scaleH {
        scaleH = scaleW
    } else {
        scaleW = scaleH
    }
    w, h := int(float64(sw)/scaleW), int(float64(sh)/scaleH)
    tmp := image.NewRGBA(image.Rect(0, 0, w, h))
    for y := 0; y < h; y++ {
        for x := 0; x < w; x++ {
            tmp.Set(x, y, src.At(int(float64(x)*scaleW), int(float64(y)*scaleH)))
        }
    }
    return resize2(dst, tmp)
}

// 缩放图片函数
func resize2(dst *image.RGBA, src image.Image) error {
    sw, sh := src.Bounds().Dx(), src.Bounds().Dy()
    dw, dh := dst.Bounds().Dx(), dst.Bounds().Dy()
    scaleW, scaleH := float64(sw)/float64(dw), float64(sh)/float64(dh)
    if scaleW > scaleH {
        scaleH = scaleW
    } else {
        scaleW = scaleH
    }
    for y := 0; y < dh; y++ {
        for x := 0; x < dw; x++ {
            dst.Set(x, y, src.At(int(float64(x)*scaleW), int(float64(y)*scaleH)))
        }
    }
    return nil
}
ログイン後にコピー

このコードは、最初にsource.jpgという名前の画像ファイルを読み取り、次にimage.Decodeを呼び出します。 () 関数は、画像ファイルを Golang の image.Image オブジェクトにデコードし、次に、計算プロセスで元の画像のアスペクト比を使用して、スケーリングされた画像サイズが歪まないように新しい画像のサイズを計算します。 、jpeg.Encode() 関数を呼び出して、スケーリングされた画像を resize.jpg という名前の新しいファイルとして保存します。

2. goimage サードパーティ ライブラリを使用する

goimage は、Golang の強力な画像処理ライブラリであり、ズームなどのさまざまな画像処理操作を実装できる豊富な関数とインターフェイスを提供します。 . 、回転、切り抜き、フィルターなど。その機能はそれだけではなく、画像のスティッチング、切り抜き、HDR 合成などのより複雑な操作も提供します。

goimage に基づいて画像スケーリング操作を実装する方法を示しましょう:

package main

import (
    "github.com/disintegration/imaging"
    "image/jpeg"
    "os"
)

func main() {
    // 读取源图片文件
    file, err := os.Open("source.jpg")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 解码源图片文件
    img, err := jpeg.Decode(file)
    if err != nil {
        panic(err)
    }

    // 缩放图片
    resized := imaging.Resize(img, 640, 0, imaging.Lanczos)

    // 保存新图片文件
    newFile, err := os.Create("resized.jpg")
    if err != nil {
        panic(err)
    }
    defer newFile.Close()

    // 编码新图片
    if err := jpeg.Encode(newFile, resized, &jpeg.Options{Quality: 80}); err != nil {
        panic(err)
    }
}
ログイン後にコピー

このコードは画像スケーリング関数も実装していますが、手動ではなく goimage ライブラリ関数で imaging.Resize() を使用します。スケーリング アルゴリズムを自分で実装します。これにより、画質と安定性を確保しつつ、開発者の負担をある程度軽減することができます。

3. imagick サードパーティ ライブラリを使用する

標準ライブラリの image パッケージと goimage サードパーティ ライブラリに加えて、imagick ライブラリを使用して Golang で画像処理を実装することもできます。 。 Imagick は、ImageMagick の Golang バウンド バージョンであり、基礎となる画像処理機能と高度な画像操作機能を提供します。

imagick ライブラリを使用して画像スケーリング関数を実装する方法を示しましょう:

package main

import (
    "github.com/gographics/imagick/imagick"
    "io/ioutil"
    "os"
)

func main() {
    // 初始化imagick库
    err := imagick.Initialize()
    if err != nil {
        panic(err)
    }
    defer imagick.Terminate()

    // 读取源图片文件
    file, err := os.Open("source.jpg")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 解码源图片文件
    buffer, err := ioutil.ReadAll(file)
    if err != nil {
        panic(err)
    }
    wand := imagick.NewMagickWand()
    if err := wand.ReadImageBlob(buffer); err != nil {
        panic(err)
    }

    // 缩放图片
    if err := wand.ResizeImage(640, 0, imagick.FILTER_LANCZOS, 1); err != nil {
        panic(err)
    }

    // 保存新图片文件
    if err := wand.WriteImageFile(imagick.NewMagickWand().NewCollection(), "resized.jpg"); err != nil {
        panic(err)
    }
}
ログイン後にコピー

このコードは、imagick ライブラリの初期化と画像スケーリング操作を実装します。具体的な実装プロセスは同じです。前の 2 つの例とほぼ同じです。ただし、imagick ライブラリのインターフェイスは、Golang を使用する通常の習慣とは異なる場合があるため、特別な注意が必要であることに注意してください。同時に、imagick ライブラリは、開発者が実際のニーズに応じて使用できる豊富な画像操作インターフェイスも提供します。

要約すると、この記事では主に、Golang で画像を処理するいくつかの方法 (標準ライブラリの画像パッケージの使用、goimage サードパーティ ライブラリの使用、imagick サードパーティ ライブラリの使用) について説明します。サードパーティライブラリが使用できない場合は、標準ライブラリのイメージパッケージを使用することをお勧めします。より豊富で複雑な画像操作を行うには、goimage または imagick の 2 つのライブラリを使用できます。最後に、読者の皆様がご自身の状況に応じて適切な画像処理方法を選択していただければ幸いです。

以上がgolangで画像を加工する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!