デジタル画像の普及に伴い、画像圧縮は画像処理の重要な部分になりました。圧縮すると、ストレージ容量と送信帯域幅が削減され、画像処理の効率が向上します。 C# 言語では、さまざまな画像圧縮アルゴリズムを使用して画像を圧縮できます。この記事では、2 つの一般的な画像圧縮アルゴリズム、ランレングス エンコーディング (RLE) と Lempel-Ziv-Welch (LZW) を紹介し、対応する C# コード例を示します。
public byte[] RleCompress(byte[] image) { List<byte> compressedImage = new List<byte>(); int count = 1; byte current = image[0]; for (int i = 1; i < image.Length; i++) { if (image[i] == current) { count++; } else { compressedImage.Add((byte)count); compressedImage.Add(current); count = 1; current = image[i]; } } compressedImage.Add((byte)count); compressedImage.Add(current); return compressedImage.ToArray(); } public byte[] RleDecompress(byte[] compressedImage) { List<byte> decompressedImage = new List<byte>(); for (int i = 0; i < compressedImage.Length; i += 2) { byte count = compressedImage[i]; byte color = compressedImage[i + 1]; for (int j = 0; j < count; j++) { decompressedImage.Add(color); } } return decompressedImage.ToArray(); }
public byte[] LzwCompress(byte[] image) { Dictionary<string, int> dictionary = new Dictionary<string, int>(); List<int> compressedImage = new List<int>(); string current = image[0].ToString(); for (int i = 1; i < image.Length; i++) { string next = current + image[i]; if (dictionary.ContainsKey(next)) { current = next; } else { compressedImage.Add(dictionary[current]); dictionary.Add(next, dictionary.Count + 1); current = image[i].ToString(); } } compressedImage.Add(dictionary[current]); byte[] compressedBytes = new byte[compressedImage.Count * 2]; for (int i = 0; i < compressedImage.Count; i++) { compressedBytes[i * 2] = (byte)(compressedImage[i] >> 8); compressedBytes[i * 2 + 1] = (byte)(compressedImage[i] & 0xff); } return compressedBytes; } public byte[] LzwDecompress(byte[] compressedImage) { Dictionary<int, string> dictionary = new Dictionary<int, string>(); List<byte> decompressedImage = new List<byte>(); int nextCode = 256; for (int i = 0; i < nextCode; i++) { dictionary.Add(i, ((char)i).ToString()); } int current = (compressedImage[0] << 8) + compressedImage[1]; decompressedImage.AddRange(Encoding.Default.GetBytes(dictionary[current])); for (int i = 2; i < compressedImage.Length; i += 2) { int code = (compressedImage[i] << 8) + compressedImage[i + 1]; if (!dictionary.ContainsKey(code)) { string entry = dictionary[current] + dictionary[current][0]; dictionary.Add(code, entry); decompressedImage.AddRange(Encoding.Default.GetBytes(entry)); } else { decompressedImage.AddRange(Encoding.Default.GetBytes(dictionary[code])); } current = code; } return decompressedImage.ToArray(); }
この記事では、C# での画像圧縮のための 2 つのアルゴリズム、ランレングス エンコーディング (RLE) と Lempel-Ziv を紹介します。 -ウェルチ(LZW)。対応する圧縮関数と解凍関数を実装することで、画像を圧縮および解凍できます。これらのアルゴリズムは、画像処理で一般的に使用される圧縮アルゴリズムであり、ストレージ容量と送信帯域幅を削減し、画像処理の効率を向上させるのに役立ちます。
以上がC# で画像圧縮アルゴリズムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。