Skip to content

Quality issues for animated images #113

Description

@sergeiromanchuk

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).

Activity

  1. dreampiggy commented on Dec 3, 2024

    @dreampiggy
    Contributor

    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)

  2. dreampiggy commented on Dec 3, 2024

    @dreampiggy
    Contributor

    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.

  3. dreampiggy commented on Dec 3, 2024

    @dreampiggy
    Contributor

    ⬆️ 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions