Go を使用して PNG 画像を JPEG に変換する方法

ソフトウェア開発において画像形式の変換は、さまざまなシステムで互換性と効率的な画像処理を実現するために不可欠です。画像を形式間で変換することで、画像の保存、転送、レンダリング、操作を最適化できます。

Go エコシステムには、画像形式の変換を行うパッケージが数多く存在します。また、Golang には、画像のフォーマットと変換を行う image パッケージが用意されています。image パッケージは、画像のデコード、エンコード、サイズ変更、回転などの機能を含む、基本的な 2D 画像機能を提供します。

画像パッケージの使用を開始する

Go の組み込み画像ライブラリは、さまざまな形式の画像を操作するための包括的な機能を提供します。imageパッケージは、画像の読み取り、書き込み、操作をサポートします。

imageパッケージは、JPEG、PNG、GIF、BMP などの複数の画像ファイルの種類と形式をサポートしています。ファイルまたはストリームから画像を読み取ってデコードしたり、画像をファイルまたはストリームにエンコードして書き込んだりすることができます。これにより、Go でさまざまな種類の画像を簡単に操作できるようになります。その形式に関係なく。

このライブラリは、画像の操作と処理のための広範な機能も提供しています。imageパッケージは、個々のピクセルにアクセスするためのメソッドを提供し、ピクセル値の変更やカスタム フィルターの適用などのタスクに対する低レベルの操作を可能にします。

さらに、このパッケージは色モデルをサポートし、さまざまな色表現間で変換するためのツールを提供します。これは、さまざまなカラースペースの画像を操作するのに便利です。

PNG から JPEG への画像の変換

PNG と JPEG は、それぞれに異なる特性を持つ、一般的に使用されている画像形式です。PNG は、GIF に取って代わるロスレス形式であり、画像データと透明度を保持した高品質の画像をサポートしています。PNG は、シャープなエッジ、テキスト、または均一な色の領域を持つ画像に適しています。

imageパッケージには、2 つの形式間の画像形式の変換に使用できるjpegおよびpngパッケージが含まれています。

PNG 画像を JPEG 形式に変換する関数を作成できます。これは、画像バイトデータ ストリームを入力として受け入れる例です。

package main
import (
"bytes"
"fmt"
"image/jpeg"
"image/png"
"log"
"net/http"
"os"
)
// ToJpeg converts a PNG image to JPEG format
func ToJpeg(imageBytes []byte) ([]byte, error) {
// DetectContentType detects the content type
contentType := http.DetectContentType(imageBytes)
switch contentType {
case "image/png":
// Decode the PNG image bytes
img, err := png.Decode(bytes.NewReader(imageBytes))
if err != nil {
return nil, err
}
buf := new(bytes.Buffer)
// encode the image as a JPEG file
if err := jpeg.Encode(buf, img, nil); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
return nil, fmt.Errorf("unable to convert %#v to jpeg", contentType)
}

ToJpeg関数は、http.DetectContentType関数でコンテンツの種類を検出します。この関数は、画像バイトスライスを入力として受け取り、コンテンツの種類を文字列として返します。

switch 条件文には、画像形式が PNG かどうかをチェックするケースが 1 つあります。この関数は、image.Decode関数で画像形式が PNG 画像である場合、画像バイトスライスをデコードします。

最後に、ToJpeg関数は新しいバッファーを作成し、jpeg.Encode関数で画像を JPEG 形式でエンコードします。

ToJpegを呼び出す前に、os.ReadFile関数で PNG 画像を読み込むことができます。

func main() {
// Read the PNG image file
// Replace with the actual path to your PNG image
imagePath := "image.png"
imageBytes, err := os.ReadFile(imagePath)
if err != nil {
log.Fatalf("Failed to read image file: %s", err)
}
// Convert the PNG image to JPEG
jpegBytes, err := ToJpeg(imageBytes)
if err != nil {
log.Fatalf("Failed to convert image: %s", err)
}
//---- Write the JPEG bytes to a file ----------
// Replace with the desired path for the output JPEG file
jpegPath := " output.jpg"
err = os.WriteFile(jpegPath, jpegBytes, os.ModePerm)
if err != nil {
log.Fatalf("Failed to write JPEG file: %s", err)
}
fmt.Println("Image conversion successful!")
}

main関数は、ToJpeg関数を呼び出す前に、指定されたディレクトリから PNG 画像を読み取ります。ToJpeg関数は、JPEG 形式の画像のバイトスライスを返します。

main関数は、os.WriteFile関数で JPEG ファイルを指定されたパスに書き込みます。変換プロセスが成功すると、main関数はメッセージをコンソールに出力します。

JPEG から PNG への画像の変換

JPEG は、複雑な写真を最適化したロスレス形式です。JPEG は、圧縮率を高くすることで、ファイル サイズを小さくしますが、品質は若干低下します。

PNG とは異なり、JPEG は透明度をサポートしていません。さまざまな色やグラデーションの写真画像の表示に優れています。

output.jpgファイルをinput.pngという名前の PNG ファイルに変換する方法は次のとおりです。

import (
"bytes"
"fmt"
"image/jpeg"
"image/png"
"log"
"os"
)
// JpegToPng converts a JPEG image to PNG format
func JpegToPng(imageBytes []byte) ([]byte, error) {
img, err := jpeg.Decode(bytes.NewReader(imageBytes))
if err != nil {
return nil, err
}
buf := new(bytes.Buffer)
if err := png.Encode(buf, img); err != nil {
return nil, err
}
return buf.Bytes(), nil
}

JpegToPng関数は、jpeg.Decode関数で画像バイトスライスをデコードします。この関数は、png.Encode関数で画像を PNG 形式でエンコードするための新しいバッファーを作成します。

JpegToPng関数を呼び出すmain関数は次のとおりです。

func main() {
// Read the JPEG image file
// Replace with the actual path to your JPG image
imagePath := "output.jpg"
imageBytes, err := os.ReadFile(imagePath)
if err != nil {
log.Fatalf("Failed to read image file: %s", err)
}
// Convert the JPEG image to PNG
pngBytes, err := JpegToPng(imageBytes)
if err != nil {
log.Fatalf("Failed to convert image: %s", err)
}
// Write the PNG bytes to a file
// Replace with the desired path for the output JPEG file
pngPath := " input.png"
err = os.WriteFile(pngPath, pngBytes, os.ModePerm)
if err != nil {
log.Fatalf("Failed to write PNG file: %s", err)
}
fmt.Println("Image conversion successful!")
}

main関数は、指定されたディレクトリから JPEG 画像を読み取り、JpegToPng関数を呼び出します。この関数は、PNG 形式の画像のバイトスライスを返します。

Go の標準ライブラリには、アプリを構築するために必要なほとんどの機能が用意されています

image パッケージは、Go エコシステムの多用途ライブラリの 1 つです。image パッケージのおかげで、外部ライブラリに依存することなく、画像タスクを実行できます。

Go には、Web ベースのアプリケーションを構築するための http パッケージなど、他の多用途パッケージも用意されています。http パッケージには、Web アプリのサーバー側を構築するために必要な機能のほとんどが含まれています。

FAQ

Q: PNG を JPEG に変換するための他のオプションは何ですか?

このツールを作成することは、プログラミングの演習として役立ちますが、画像を変換するためのより良い方法があります。たとえば、Windows ユーティリティを使用して PNG を JPEG に変換できます。

Q: Go はファイル操作のための他の方法を提供していますか?

Go の os パッケージには、コア ファイル処理機能が含まれています。ファイル名とパスを処理する filepath パッケージと組み合わせて使用すると便利です。

Q: この試行のためにサンプル画像をどこで見つけることができますか?

優れたサンプル データとなる無料のストック画像のオンライン ソースは数多くあります。