Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Quality issues for animated images #113

Open
sergeiromanchuk opened this issue Dec 2, 2024 · 3 comments
Open

Quality issues for animated images #113

sergeiromanchuk opened this issue Dec 2, 2024 · 3 comments

Comments

@sergeiromanchuk
Copy link

Description

My code includes the setting of this limitation:

/// Limits scale down to 24MB.
SDImageCoderHelper.defaultScaleDownLimitBytes = 24 * 1_024 * 1_024

When I get an animated image data that weighs 1.8 MB, the quality is severely degraded, and if I saw correctly my final image was 0.5 MB. I tried to play around with setting the value and in the end I got an image of 7200 bytes with the 1 MB limit set.

This was strange to me, so I tried exploring the codebase and seemed to find the problem in this line: https://github.com/SDWebImage/SDWebImageWebPCoder/pull/75/files#diff-e9c046b25a4d1b5fd2e490c2ebc802f1a63ef0459e0ad74dd3647f72d9c68323R94

Am I misunderstanding the expected behavior? Because it looks like a bug to me. Since it is strange that by setting the limit to 24 MB I get image quality degradation and image size reduction when its image data size is only 1.77 MB.


Also maybe you can tell me why when I try to download a heavy image and several small images, if the heavy image was added earlier, I don't get a response for the small images until the large one is downloaded? (It is important to note that I am considering the case of downloading an image from disk or over the network, only in these cases this happens).

@dreampiggy
Copy link
Contributor

dreampiggy commented Dec 3, 2024

Image Data Size (JPEG/WebP/PNG)
!=
Image RAM (buffer) size (CGImage/UIImage/CIImage)

Image Data are "Compressed Format" of a vector, vector element is pixel (normally just Pixel8888, a 3/4 component uint8_t, or just think as a uint24_t/uint32_t)

The calculation is correct actually. Image Buffer Size on RAM is just

BytesPerPixel * PixelCont
= BytesPerPixel * PixelPerFrame * FrameCount
= BytesPerPixel * ImageWidth * ImageHeight * FrameCount
= BytesPerComponent * ComponentCount * ImageWidth * ImageHeight * FrameCount, Component == 4 if contains alpha, else 3 for RGB
= sizeof(PixelType) * ComponentCount * ImageWidth * ImageHeight * FrameCount, if you use RGBA8888, the BytesPerComponent is 8 (sizeof uint8_t)

@dreampiggy
Copy link
Contributor

dreampiggy commented Dec 3, 2024

This scaleDownLimitBytes can be set for Per-Image-Request, not that global control. So you can limit a larger bytes for animated image

Pass SDWebImageContextImageScaleDownLimitBytes on loadImageWithURL or setImageWithURL API from the top-level


Another addition of behavior is that we separate the limitBytes for static image and animated image, they can have different scale down limit bytes.

@dreampiggy
Copy link
Contributor

dreampiggy commented Dec 3, 2024

⬆️ If you're interested in the feature above, leave comments here

When finished, I can submit a feature request to https://github.com/SDWebImage/SDWebImage and implement it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants