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

Integer scaling (pixel-perfect scaling) for scaling images with no blur at integer scales like 2.0 (200%) #246

Open
Marat-Tanalin opened this issue May 4, 2023 · 3 comments

Comments

@Marat-Tanalin
Copy link

Images, backgrounds, and videos are unreasonably blurry in browsers even at integer scales such as 2.0 (200%) which is typical e.g. for 24-inch 4K monitors. Integer (pixel-perfect) scaling turns each logical pixel into a square group of integer number of physical pixels of the same color not affected by colors of adjacent pixels.

interpolation-bilinear

Would be nice to have integer scaling as a browser-wide feature. SmartUpscale extension (addon) is an attempt to force blur-free pixel-perfect scaling at integer scales while still using interpolation at fractional scales, but it can only do this for embedded images, and not for backgrounds, and performance is lower than could be with native implementation built into browser.

Are such features in the goals/scope of the project? Thanks.

@trickypr
Copy link
Member

trickypr commented May 5, 2023

I get the reason why you would want nn (or more correctly pixelated) to be your default image-rendering method. However, there is a good reason why browsers implement biliniear or something similar as the default. It works really well for natural landscapes etc. The kind of place where JPEG compression artifacts are barely noticeable.

If you want to change the default rendering method, it should be as simple as adding this to a stylus style:

* {
  image-rendering: pixelated;
}

Alternatively, if you think it is valuable, I can add a pref that changes what the default render method is.

@Marat-Tanalin
Copy link
Author

Marat-Tanalin commented May 5, 2023

The whole point of my proposal and how SmartUpscale works is preventing unreasonable blur at integer scales by conditional selection of what algorithm to use: pixelated is only used at integer scales when it does not result in distortion, and default blurry scaling is used at fractional scales. Also, SmartUpscale has an option for the maximum scale to use pixelated at, which allows to prevent visible pixelation at e.g. 3.0+, but still prevent unreasonable blur at 2.0.

It’s not about forcing pixelated for all images.

I would be totally fine with enabling the feature via a pref without GUI. So we would need two prefs like these:

  • pulseBrowser.imageRenderingPixelatedAtIntegerScales.enabled (boolean);
  • pulseBrowser.imageRenderingPixelatedAtIntegerScales.maxScale (integer like 3 or 4).

(The pulseBrowser. prefix is optional, just would probably be useful to prevent any conflicts with Firefox own prefs.)

@trickypr
Copy link
Member

trickypr commented May 6, 2023

Thanks for the clarification. I might look into this after my semester has ended

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