SDWebImageWebPCoder icon indicating copy to clipboard operation
SDWebImageWebPCoder copied to clipboard

Low compression quality compared to cwebp CLI tool

Open pawelmtw opened this issue 8 months ago • 1 comments

Description

When using SDImageWebPCoder to encode images with lossless options, the resulting file size and compression quality appear to be worse compared to Google's cwebp command-line tool. Despite both using lossless compression settings, SDImageWebPCoder produces slightly lower quality images, with visible artifacts and banding on gradients and shadows.

I experimented with different encoding options such as: encodeCompressionQuality, encodeWebPMethod, encodeWebPPass etc. Despite these adjustments, the output quality and file size were still worse compared to cwebp -lossless. This suggests a fundamental difference in how the WebP encoding is implemented in SDImageWebPCoder versus the official WebP compression tool.

Code

SDImageWebPCoder:

if let data = SDImageWebPCoder.shared.encodedData(with: nsImage, format: .webP, options: [.encodeWebPLossless: 1]) {
  try data.write(to: destination))
}

cwebp:

cwebp -lossless input.png -o output.webp

Results

Image

pawelmtw avatar Apr 01 '25 15:04 pawelmtw

Can you use cwebp's raw buffer mode ? When means, I guess the loseless happened during the decoding part from ImageIO PNG decoder, to the libwebp's encoder. The image's bitmap is stored via CGImageRef

But anyway, I can have a try to debug and find out the reason why whether this lossless mode actually work. By looping to decoding-encoding loop 10 times for the same CGImageRef input.

dreampiggy avatar Apr 03 '25 09:04 dreampiggy