Closed
Bug 98971
Opened 23 years ago
Closed 18 years ago
Prettier image resizing & scaling (Bilinear, Bicubic, anything better than Nearest Neighbor)
Categories
(Core Graveyard :: Image: Painting, enhancement)
Tracking
(Not tracked)
VERIFIED
FIXED
mozilla1.9alpha1
People
(Reporter: shelby, Assigned: paper)
References
Details
(Whiteboard: [parity-opera] [parity-IE])
Attachments
(8 files, 2 obsolete files)
Here is a chance for Mozilla to get a leg up on IE. There are many valid cases where the IMG width and height attributes do not equal the IMG src's actual width and height. Thus image scaling occurs in the browsers. Unfortunately no browser I know of uses bilinear scaling to achieve a decent results. In the case of line art, bilinear scaling can be the difference between seeing something instead of nothing at all! In other words, we could characterize this as a bug. Imagine an image with vertical 1 pixel wide lines that is scaled horizontally by 50%-- the lines on even numbered columns will disappear with current browser scaling algorithms. Given the fast CPUs in current day computers, and an algorithm I will donate to this project, there is no excuse not to improve the browser. I will attach an example which illustrates one of many valid uses for image scaling. Many people might argue that if you want good image quality then designer should scale the image used in the SRC attribute. However, there are cases where this isn't possible. In the attached example, the IMG tag uses width=50% and height=50% attributes to create a web page that scales with the browser window. Imagine it is also possible to use Javascript to create web pages which scale in the same proportion for height and width to fit the width of the window. In fact, with absolute positioning introduced by CSS, this becomes a necessity for web pages which contain 100% absolutely positioned content. This is especially important to us, the developers of Cool Page (coolpage.com), because our product (and other such pixel-accurate drag+drop such as Dreamweaver, Fusion) can use 100% absolute positioning. And we have intention in the next release to be the first product to create absolutely positioned web pages which scale to the width of the browser window (i.e. to overcome one of the major weaknesses of absolutely positioned content versus flowed content). You can do a links search on 3Dize.com at AltaVista and find 15,000+ web pages made with our product. However, I hope my generic example proves that this is not simply a feature request to support our product. Also you will often find on the web that naive designers will use the same SRC for the thumbnail. Although this is poor design, it is quite common in my experience, and thus these thumbnails look horrible in current browsers. Also the strongest argument for this improvement would probably be Mozilla's own use of it's ImageLib. If you are creating GUI with the layout engine, then bilinear scaling is a no brainer IMO. I hope I made a strong case for fixing this borderline bug.
The ResizeSmaller.cpp code illustrates a fast bilinear downsample using precomputed row and column weights. I am not sure if the of the legal state of this algorithm. I am willing to donate the algorithm and code to the Mozilla project under the Mozilla license, as long as we retain our 100% right (All Rights Reserved) to the code. In other words, everyone else is bound to the Mozilla license with regard to this code, but we are not. The algorithm may already be in the public domain, since it is quite obvious way to do it. I am not sure. I never optimized the upsample case. I use a image doubler and then downsample to fractional scale. The bug at the transparency edge is probably in the image doubler. As implied, this algorithm handles transparency! The algorithm works in 24 bit mode. I did not investigate what requirements this would place on integration with ImageLib. Good luck!
Updated•23 years ago
|
Status: UNCONFIRMED → NEW
Ever confirmed: true
I forgot to mention this algorithm is very fast! It supports real-time scaling in Cool Page on a decent Pentium!
Comment 8•23 years ago
|
||
As long as this algorithm can properly handle the scaling of images with transparency, it sounds like a great idea to me. That is to say, if an image has a transparen pixel next to a black pixel, the half-sized version should be a 50% transparent black pixel.
The algorithm detects the transparency color, so just replace with the background color in bilinear calculation. Or output an at least 2-bit alpha channel for compositing stage. I am not versed on the way images are composited in the Mozilla, so I am not sure which method is more appropriate in this case. If any one needs me to do some tweaks to the algorithm, please give me a succinct description of inputs and outputs. I do not have time to become versed in the ImageLib, and/or do testing. The algorithm is well commented, so might be faster for someone versed in ImageLib to just carry the ball from here.
Updated•23 years ago
|
Whiteboard: has code to be incorporated!
Comment 10•23 years ago
|
||
*** Bug 105932 has been marked as a duplicate of this bug. ***
Comment 11•23 years ago
|
||
To anybody who might accept this bug: While working on this bug, you might want to test your code against the test case I filed for bug 105932.
Updated•23 years ago
|
Target Milestone: --- → Future
Comment 12•23 years ago
|
||
i would say this bug and bug 75077 are closely related, so i am marking that as a dep to this. if anyone disagrees, feel free to remove.
Depends on: 75077
Comment 13•22 years ago
|
||
I'll vote for this one. If this also affects tab icons, I'll vote for it twice. ;) See Bug 152506 for an example of tab icon scaling.
Comment 14•22 years ago
|
||
IIRC I saw an artical on a fast image scaling algorythm in Dr Dobbs' recently. Just thought I'd toss that in. :)
Comment 15•22 years ago
|
||
We already have an algorithm. We event have an implementation. It's attached to this bug. What needs to happen is integration of this implementation with the existing image library.
Keywords: helpwanted
Comment 16•22 years ago
|
||
Voting to this enhancement by reason of HTML/CSS evangelism: this will allow make web pages with content independing of screen resolution. We'll can use relative CSS units to point size of picture (e.g. <img ... style="width:20em;height:10em;" />) and see nice results.
Comment 17•22 years ago
|
||
See also bug 73322 about auto-scaling images. See also bug 4821 about full zooming. Although these bugs don't depend on this one, this bug would be handy if those were implemented.
Comment 18•22 years ago
|
||
FWIW I hacked-up antialiased down-scaling in mozilla about three years ago, but only in the X-direction, and only with a 1-bit transparency mask (I don't think moz supported anything with full-alpha at the time). I had to give up on a full (X,Y) solution because of the funky way that mozilla accumulated scanlines, the mozilla-guts side of things was getting nontrivial. Just a warning that (although the codebase may have changed to make this much easier), having an algorithm and an implementation is the easiest part. (Also not to rain on anyone's parade but pre-cached fragment weights have been used in graphics programs since about 1996, probably a lot earlier. On the code-rights side, IANAL but allowing mozilla to use your code doesn't take any rights away from *you*, the original code is still your code.)
Comment 19•22 years ago
|
||
*** Bug 179564 has been marked as a duplicate of this bug. ***
Comment 20•22 years ago
|
||
Has anyone looked into licensing the appropriate bits of ImageMagick perhaps? Also, since I reported a duplicate bug, here's my samples page: http://www.fibrespeed.net/~mbabcock/mozilla/image_scaling.html
Assignee | ||
Comment 21•22 years ago
|
||
*** Bug 131473 has been marked as a duplicate of this bug. ***
Updated•22 years ago
|
Summary: Bilinear scaling need for line art and scalable web pages → [RFE]Bilinear scaling need for line art and scalable web pages
Comment 22•22 years ago
|
||
I thought "[RFE]" in summary was deprecated in favor of Severity: enhancement.
Summary: [RFE]Bilinear scaling need for line art and scalable web pages → Bilinear scaling need for line art and scalable web pages
Comment 23•22 years ago
|
||
hm, on most platforms, mozilla just uses the operating system's functions to scale the image
Comment 24•22 years ago
|
||
This would be even more useful now, with the automatic image resizing IMO. it appears that the implementation wouldn't be too hard.
Comment 25•22 years ago
|
||
Adam, the bug is helpwanted. Was your comment an offer to help? ;)
Comment 26•22 years ago
|
||
biesi: I know you have quite a bit of experience with libpr0n. I am not asking you to implement this, but I was wondering if you or stuart could take a look at what needs to be done and make a list of that for anyone who wants to impliment this.
Comment 27•22 years ago
|
||
I would think that this would need to be done in each platform's gfx/src/*/nsImage*.cpp, or maybe in gfx/src/imgScaler.cpp (in which case platform nsImage* would need to be modified to use imgScaler, most just use the platform's drawing routines for most stuff). note that this is Image:GFX, not core imagelib. Also, I would think that this costs quite a bit of performance... but feel free to try to implement this.
Component: ImageLib → Image: GFX
Comment 28•22 years ago
|
||
oh right, the function that would need to be changed is, I think, nsImage*::Draw (both, unless one calls the other anyway) and DrawToImage.
Comment 29•22 years ago
|
||
Please note that IIRC GTKfe (and X11fe I presume) do their scaling on the server-side now, so implementing bilinear scaling for these front-ends will require a bit of rearchitecturing (I don't know if things have changed too much by now for the old old scaling code to be a useful reference).
Comment 30•22 years ago
|
||
Also not that said rearchitecturing will lead Mozilla to take up a lot more ram and to be a _lot_ slower at scaling (which is why it was moved server-side to start with).
Comment 31•22 years ago
|
||
Being slower or faster shouldn't be a problem -- the fact that it should be configurable or not fixes that issue. People who want the better looking images will want this feature and those who don't care may turn it off or even turn off images altogether (as I often browse). That said, I have no ability that I know of to help on this bug -- I would simply love to see it done. I'm perfectly willing to go hunt down routines and source authors for licensing, etc. though. Like I said, ImageMagick does some fairly good scaling and the GIMP does an even better job (both OSS; licenses may need to be arranged for code segments). I currently use Intel's performance primitives DLLs for all my image scaling in Windows C++ software; I understand that these libraries are cross-platform (exist on Linux, *BSD, Windows, maybe more?) but may not be the route the project wants to go. Again, perhaps some form of licensing arrangement could be made with such a company as a 'sponsor' of this feature?
Comment 32•22 years ago
|
||
BTW, bilinear scaling for image might be applied instantly (in few milliseconds) via OpenGL interface. Almost every contemporary computer has OpenGL-enabled video card; practically every contemporary OS has corresponding APIs (more, MacOS X Jaguar uses OpenGL as a core for GDI functions). May be, OpenGL is the cheepest way to solve this bug?
Comment 33•22 years ago
|
||
I thought about that a while yesterday, manko. You can't just OpenGL-draw onto an arbitrary surface though, basically I think an OpenGLfe would have to be written. There are complications to efficiency there. Not insurmountable though.
Comment 34•22 years ago
|
||
> the fact that it should be configurable or not fixes that issue Um. No. We are _not_ having a pref to control the friggin' image scaling algorithm. At best, it would be a build-time option and even then the code will be much more complex as a result; we should weigh the costs of such complexity _very_ carefully. See bug 170553 for OpenGL.
Comment 35•22 years ago
|
||
Since bilinear scaling would only be done when images are resized, it wouldn't slow things down in most cases, right? Therefore, if there is no scaling occuring, we shouldn't do bilinear scaling obviously. Also, we might want to decide upon other cases where its not necessary. My question is whether we should rely on hardware/etc or whether we should do the scaling ourselves. We are capable of writing fast and attractive scaling routines ourselves. Inconsistencies between APIs and toolkits across platforms won't apply then. If OpenGL is guaranteed to work equally on every system that Mozilla is ported to, then this is fine. Let's deal with that when we move our graphics code to OpenGL (if it ever happens) AFTER we have tested exhaustively and _if_ its truly a better way to do it. Its experimental and won't be available immediately for the bug 73322 and bug 4821 and others. And those bugs rely on this one being fixed to be attractive. Going to OpenGL now for this fix when that hasn't been our policy in the past isn't the way to go about this imho. It would be experimental for a long time and wouldn't result in this bug getting fixed. Can't we use a modified version of the algorithm in attachment 48784 [details] within the imagelib code to make a cross-platform version of bilinear scaling? Is relying on hardware acceleration or OpenGL working identically on bit blotting on every platform really necessary at this time? Won't that just make things more complicated and slow down the fixing of this bug?
Comment 36•22 years ago
|
||
Bilinear interpolation (or higher order interpolation) will be measureably slower than nearest neighbour unless it is hardware accelerated. As to how often this occurs, I was under the impression that it occurs much more often than one might think with all the img size modifiers in html/css. If we are going to do it in software, people must be able be able to "self-inflict" the perf cost... because most users will just complain that everything is slower for no "noticeable" (in most cases) benefit. If we cant, we shouldn't bother OR treat it as a side case for small subset of keeners (as is done for MathML and SVG now). The latter point is (I think) what comment #34 espouses. My take is that we really want to take advantage of hardware acceleration for any graphics algorithm improvements. New algorithms are the easy part. Options that take advantage of hardware: - OpenGl (x-platform -- big changes required... some issues too) - DirectX (win32 only -- big changes required) - GDI+ (win32 only -- smaller changes required) - other (free) libs?
Comment 37•22 years ago
|
||
> We are capable of writing fast and attractive scaling routines ourselves. You must be kidding. Scaling ourselves is easily an order of magnitude slower than doing it in hardware. In the case of X, it's as much as two orders of magnitude slower than doing it server-side (depends on the latency and bandwidth). > it wouldn't slow things down in most cases, right? As I recall, a large fraction of images on the net _are_ resized. This is trivially testable, of course....
Comment 38•22 years ago
|
||
> Scaling ourselves is easily an order of magnitude slower than doing it in
hardware.
This may be true, but that doesn't necessarily mean the slowdown is
unacceptable. If it would take 10 ms in hardware (random assumption), and 100ms
in software, I'm fine with it. Though I had no real hard evidence, I just tried
resizing a 2MB image in Photoshop using bicubic scaling and it took well under 1
second (thus those 100ms don't seem that unreasonable). Then, surely, bilinear
filtering will not give us much of a performance hit, especially because most
images won't be 2 meg in size, and for the ones that are, the scaling time will
be pretty insignificant compared to the download time.
Moreover, it seems to me the scaling can be done incrementally, just as the
rendering of the image is done incrementally while it downloads? In that case,
the performance hit will be all but 0. Surely we have some cycles to spare while
we're just downloading an image to do some scaling?
Also, I don't think most webpages use scaled images anyway (though a lot may add
reduntant width/height tags/css rules to specify the height the image already
has anyway), so this shouldn't even be a problem for most webpages.
Most webpages that seem to (extensively) use scaled images are very badly
designed image galleries that take ages to load anyway, because people but 20+
large images on one page and lets the browser resize them. For these sites, the
performance hit is insignificant compared to the download time, and spending a
few more cycles on making the image look okay would be very much what I want.
Comment 39•22 years ago
|
||
Arnoud, your whole comment misses one important thing -- Mozilla scales images every time it paints them. It's not a one-time cost, but a cost for every redraw. The alternative is a cost in memory that was found prohibitive (keeping both the scaled and unscaled version of the image around, etc). And instead of just guessing at how often scaled images happened, I'd suggest you actually test it... you may be surprised (or I may be, but either way arguing over something that's easily testable is silly).
Arnoud --- what bz said :-). Brian points out that we can't just say "we'll use OpenGL", and he is absolutely right. OpenGL cannot help us with this anytime soon. Platform-specific patches to the existing platform GFX implementations, preferably ones that help us by using accelerated platform APIs to avoid the speed or space hit, are the way to go here. However even if someone produces a patch to use GDI+ (for example) in GFX/Win32, I'd still like to see us somehow detect whether the operation is accelerated and turn off bilinear scaling if it is not.
Assignee | ||
Comment 41•22 years ago
|
||
gah, ok, give me a day or two to dig up my old GDIPlus patch. I'll attach it here and people (on Windows) can decide for themselves if hardware accelleration is good enough yet to use it. I'll even build a new .dll for 1.3final when it comes out, so non-'source having' people can see. My opinion is, no, at least for the way Mozilla does things. Mind you, my implementation is a hack, and is only about 6 lines long.
Assignee | ||
Comment 42•22 years ago
|
||
Just for clarification, my comment was not a direct reply to roc. I actually wrote that 10 minutes earlier, but didn't notice I had a bugzilla mid air collision.
Comment 43•22 years ago
|
||
Re: Comment# 40: Interesting idea... I am not aware of an api call in GDI+ which allows you to solicit which operations are hardware accelerated. I have dont a cursory search of the MSDN docs without finding anything like this.
Even if we can't detect which operations are hardware accelerated, we can measure the time taken for bilinear scaling operations and disable them on the fly if the average time gets too high.
Comment 45•22 years ago
|
||
As hinted to by comment #38, there is a lot of time (compared to current CPU speeds) spent downloading an image to do software scaling and there's no (little) need for a high-quality algorithm, just one that looks a lot better than the current one. On the assumption that images are drawn incrementally and scaling can be done in a vertical-draw optimized fashion, cycles can be spent doing the scaling while drawing. Better yet, for user experience (not necessarily for the coding of it) would be to actually draw it the fast way and do the scaling as a seperated low-priority thread. In the case of a dial-up user on a P350, the images will probably still end up being bilinearly scaled and filtered faster than download, but if they resize the window, the image quality would be degraded until the resize thread catches up. In the case of the broadband user with an Athlon 2100+ though, scaling would probably keep up with both download speeds and redraws. (again, the filtering isn't _that_ processor intensive, as pointed out earlier, even if its a lot slower than hardware scaling). The only case that might need special consideration might be scrolling; this might be part of what comment #39 is refering to. If the images are scaled 'live' on each redraw, then scrolling needs to be taken into account and the scaled image should be memory cached. However, this would require a seperate bug to be filed for the caching of images with their specific rendered resolution as I doubt the current cache code tracks anything more than the fqdn, path and name of the image.
Comment 46•22 years ago
|
||
BTW, Windows 200 uses bilinear scaling to display 24-bit BMP images as stretched desktop wallpaper. So, this might be used to estimate CPU cost of this algorithm. I have an little experimentation. My hardware: Pentium III 600/Riva TNT2 M64/17" monitor 1152x864@85Hz 1. To exclude probably hardware acceleration, I went to: Control Panel/Display/Settings/Advanced/Troubleshooting and have moved slider to leftmost position. 2. I have created some 24-bit BMPs sized from 64x64 to 1024x768 and placed it into \WINNT directory. 3. I go to Control Panel/Display/Background, choose Picture Display:Stretch. 4. For every 24-bit image I clicked on it in list, then clicked Apply button. Image appeared as desktop background stretched to 1152x864 and I tried to estimate delay between clicking on button and finishing of painting. Results: In all cases delay by eye not exceeds 0.1-0.2 seconds. I think, that demonstrates that even in this quite heavy case (scaling from 64x64 to 1152x864) bilinear scaling requires not so much CPU resurces.
Comment 47•22 years ago
|
||
Michael, the other case (in addition to scrolling) that we need to worry about are "DHTML" animations... those cause things to be redrawn over and over again as they are moved around; often the page designer expects this to happen at intervals of 10-15ms (and bugs get filed when this does not, because it is _very_ noticeable). Needless to say, 0.2-second response would be unacceptable here. Keeping scaled images cached has already been considered (and rejected), as I said in comment 39. One other thing to keep in mind that people seem to be forgetting is that on Linux the limiting factor is likely to be not only CPU power but also I/O latency and bandwidth. This is especially a problem with a "remote" server (where by "remote" I mean anything that can't use memory mapping and has to actually go over TCP/IP, even if it's a loopback device). This is why server-side scaling, which keeps all the data on the server at all times, is far preferable to client-side scaling.... Just tossing out items to consider, Boris
Comment 48•22 years ago
|
||
Boris, 0.2 second is gross time to draw whole desktop 1152x864 (3 Mb of video data!). It includes time to send data to video adapter, time to handle button clicking etc. When I compared drawing bilinear with rough scaling (Windows make it for 256-bit images), difference is even no more than 0.05-0.1 seconds. If we'll paint image by pieces as download process goes, time will be significantly smaller. About further scrolling etc: we could keep resized image data in memory buffer. I don't know how it's in fact, but I'm practically convinced that image displaying module keeps bitmap data in RAW format (parsed from gif/jpeg/png/etc.) during all time while page is actually displayed. We could simply change this RAW data from original image to resized, thus bilinear resizing will be needed only once per page. Anyway, we could make user to be enabled to turn off bilinear scaling via prefs if he considers it to slow down his computer.
Comment 49•22 years ago
|
||
manko ... let's think about this for a minute. in x11 which is one of the ways mozilla can be run, the entire application can live on the other side of a network connection. suppose the network connection is 28.8kbps (it's called dialup, and i've done this), and suppose that you load a DHTML page which moves scaled images around as fast as it can. if you're suggesting that we need to send 3mb of data over a 28.8kbps pipe in <0.2 seconds then we have a serious problem. picture: internet / end-user@localhost ----------------/--------------------- mozilla <-dialup-> XServer /|\ / | / \|/ / webserver / Remember, in the current world we send the image data from mozilla to the XServer and then tell it to scale the image as necessary. So we send the image data over the slow link *once* and then do some relatively cheap albeit perhaps not pretty operations on it many many times (DHTML). In your world, we do lots of pretty operations on the image and after each operation we have to send the whole image over the slow link.
Comment 50•22 years ago
|
||
Sorry, but you maybe have missed a point. If you want see 24-bit image sized to 1152x864, you need send 3Mb data to screen regardless of scaling algorithm or even without scaling (if original image size is equal to 1152x864). Scaling images to reasonable dimensions (for example, 200x200 pixels) will require 120K buffer - and, again, regardless of scaling algorithm. I don't know details of x11 realization, but it seems to me that scaling algorithm and data exchange between server and termilal are very weakly linked issues. About DHTML and scrolling issues see my suggestion at comment #48, paragraph 3. It's highly probably that we don't need resize image again and again while one page is still being displayed. Finally, if we'll have a pref, you could simply turn off bilinear scaling of you consider it to be too slow. As I can comprehend, if you connect from remote terminal to X-server via dialup, you would prefer to turn off images completely.
Comment 51•22 years ago
|
||
Yet another consideration: if we'll scale 3M image during 0.2s (maximum, probably faster), 120K image will be scaled during 8ms. And if we take into account that 120K will fit in CPU cache completely, approximate time will be significantly smaller.
manko, we used to cache images after scaling, but we stopped doing that for various reasons, including that it used too much memory, and we don't want to start doing it again. Boris clearly said this in comment #47. Please don't keep bringing it up.
Comment 53•22 years ago
|
||
It was discussed in comment #50, but I'm going to slam comment #49 as well (and all previous times server/client-side rendering has come up). If an image is going to be sent over the X protocol at a given resolution, it will be sent at that resolution no matter _what_ it looks like or _how_ it was rendered. The CPU costs will be moved to the X client (remote machine) and the X server will display and receive the _same_ amount of data as it would no matter whether bilinear resizing is done or not. Also, the fact that rendered image caching was rejected once in another context does not mean that it doesn't bear discussing in this case. Perhaps its now a worthwhile tradeoff.
Comment 54•22 years ago
|
||
do you have a way to tell an xserver to do bilinear scaling? the proposal is that mozilla (xclient) do bilinear scaling. old world: mozilla loads image mozilla sends image to xserver (not cheap) mozilla tells xserver scale image to <...> and put at <...> (cheap) mozilla tells xserver scale image to <...> and put at <...> (cheap) mozilla tells xserver scale image to <...> and put at <...> (cheap) mozilla tells xserver scale image to <...> and put at <...> (cheap) your world: mozilla loads image mozilla scales image (not free) mozilla sends image to xserver (not cheap, possibly bigger than original) mozilla tells xserver scale image to <...> and put at <...> (cheap) mozilla scales image (not free) mozilla sends image to xserver (not cheap, possibly bigger than original) mozilla tells xserver scale image to <...> and put at <...> (cheap) mozilla scales image (not free) mozilla sends image to xserver (not cheap, possibly bigger than original) mozilla tells xserver scale image to <...> and put at <...> (cheap) mozilla scales image (not free) mozilla sends image to xserver (not cheap, possibly bigger than original) mozilla tells xserver scale image to <...> and put at <...> (cheap) There's nothing wrong with sending an image across the wire once, we all know you have to do that if you want the image to appear. The problem is that the bilinear concept being proposed is a mozilla (xclient) coded feature which means that we have to send a larger image across the wire many more times.
Comment 55•22 years ago
|
||
I *think* that XIE has the ability to bilinearly (or otherwise) scale the image at the server-side. We even used to have code in Mozilla to use XIE for server-side scaling. HOWEVER, XIE is dying by the minute, and while I recall it being a bit faster than the neat server-side scaling trick that Mozilla now uses, XIE's use is generally deprecated... hence its dropping from the codebase.
Comment 56•22 years ago
|
||
Yeah, XFree86 is dropping XIE support, last I checked. So let's not go there. Further, I'm not saying the X issues should prevent this being implemented. I'm just saying that we should keep them in mind. Since, as roc says, this would need to be done in platform-specific code anyway, we could implement it on Windows first, as a test, for example.
Assignee | ||
Comment 57•22 years ago
|
||
You need a fairly recent Platform SDK for the includes, and you need the gdiplus.dll, which is at http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=BFC0B436-9015-43E2-81A3-54938B6F4614 Personally, I dislike Microsoft's (or video card's?) bilinear quality.. it's way too blurry. Their bicubic is much nicer to look at. Considering both of them are slow, I'd choose bicubic over bilinear if I only had a choice of one. The other non-high quality modes (commented out) just plain sucked for me.. they weren't much better than what we do now. Your mileage may vary, since in theory this could depend on the video card. Here's a good sample page to try out stuff at: http://www.sigames.com/news_view.php?act=2&id=557 Note: The images on the screen will not look good at first! You'll have to scroll or refresh the page somehow (hide it and then show it again). This is because of our progressive displaying. Other example: data:text/html, <IMG SRC=http://www.sigames.com/images/resanddev/weblog/screenshots/newskin.jpg WIDTH=100%> Play with the size of your screen and scream in agony at the slowness (compare this to the speed of what we do now, which is virtually instantaneous). Some of this slowness may be caused by initializing GDIPlus every friggen time draw is called. I'll make a gkgfxwin.dll for 1.3b once it comes out, so non-builders can play.
Assignee | ||
Comment 58•22 years ago
|
||
Oh, I suppose you could click on that image link and use the automatic image resizing thing, but that has seems to have some sort of delay in it already so you would get the full effect. Definitely try bicubic though.. it looks much better, and the text is readable at a much smaller size than bilinear.
Assignee | ||
Comment 59•22 years ago
|
||
ack, previous patch had an incredibly stupid logic error in it. Anyway, here's the correct patch, and this time it has bicubic on. Actually, despite the speed, I'm almost tempted to leave this on for "Auto Image Resizing" only. It really makes a big difference in viewing those digicamera images that people put on their websites. But that's just me, and I can handle slowness when I know it was me who caused the slowness :)
Attachment #112482 -
Attachment is obsolete: true
Comment 60•22 years ago
|
||
> Their bicubic is much nicer to look at. Bicubic interpolation is bug #75077.
Assignee | ||
Comment 61•22 years ago
|
||
No, Bug 75077 talks about using an interpolation mode (preferably bicubic, but bilinear is even mentioned in the bug) during decoding of a X pass interlaced PNG, which may be a different issue if we decide to do it in libpng. There's no need for a bug for each interpolation mode. Updating Summary.
Summary: Bilinear scaling need for line art and scalable web pages → Prettier image scaling (Bilinear, Bicubic, anything better than Nearest Color)
This is not very relevant, but it's very interesting ... how to do *cubic* interpolation with commodity OpenGL hardware. http://www.vrvis.at/vis/research/hq-hw-reco/TR-VRVis-2002-031.pdf
Comment 63•22 years ago
|
||
I have not tried applying the patch from comment #59 yet, but I did a few quick benchmark tests using GDI+ on my machine with some interesting results. I am running on an AMD 850GhZ machine, with a GeForce2 card running under Win2K pro. First I did a loop of 1000 GdiplusStartup(); GdiplusShutdown(); calls. This took 3 seconds (in debug mode) so I dont think this is the overhead mentioned in comment #57. The overhead still maybe in the Graphics/Bitmap object instantiation or the drawing speed itself. Next, I loaded a JPG image which was 300x255 pixels in size and performed the following test which scales the image in a loop 500 times. My screen resolution is 1280x1024 so this image does not get clipped as it scales (because I maximize the window before I start)... Also the image grows to be about 800 x 755 by the last drawing: graphics.SetInterpolationMode(mode); for(j =0, k = 0; k < 500; ++k) graphics.DrawImage(&bitmap, j, j / 2, width+k, height+k); I did this same test for the following interpolation modes, and received the following time results (running a debug build but not from within debugger): Nearest Neighbour: 9 seconds Bilinear: 11 seconds High Quality Bilinear: 24 seconds Bicubic: 1 min 48 seconds HighQuality Bicubic: 20 seconds Observations: basic bilinear which is noticeably better than n.neighbour is less than 20% slower (suggesting it is hardware accelerated?) High Quality Bicubic is faster than High Quality Bilinear!??? This I dont understand.
Assignee | ||
Comment 64•22 years ago
|
||
Most likely your video card accelerates the HQ Bicubic, not not normal Bicubic. I find that amusing. :)
Comment 65•22 years ago
|
||
Re: comment #63 oops ... that was an 850MHz computer (not 850GHz) Also, I would be very surprised if my GeForce 2 along with associated drivers had hardware accelerated HQ BiCubic interpolation... but hey, stranger things have been know to happen. Finally, my times used the defaults for Compositing Mode and Quality and Smoothing Modes. I solicted the graphcis object and in my case (GDI+ defaults?), Compositing Mode was set to "CompositingModeSourceOver" Compositing Quality was set to "default" Smoothing Mode (anti aliasing) was set to none. If I set CompositingMode to "CompositingModeSourceCopy" my times all get reduced by 1 second. I guess the point is, that if we use GDI+ we need to set the appropriate settings to match what Mozilla is doing in the appropriate spot.
Comment 66•22 years ago
|
||
Isn't there a way to query through a device context, etc to see what hardware accelerator is capable of in terms of scaling? I know directx has this capability, but since we aren't moving to directx yet, does GDI+ have something akin to that? egrochowski@vorum.com: Can you try those same tests with hardware acceleration turned off? (I think you can do this through the control panel). 18-48 milliseconds an image doesn't sound bad. 216 milliseconds gives me a bit of pause.
Comment 67•22 years ago
|
||
You can do a GetDeviceCaps() but this is a GDI function... I am not sure how it relates to what GDI+ is doing. I cant find anything in GDI+ docs that is analagous or comparable (doesnt mean its not doable, just that i dont know how). Doing the same tests as in comment #63 after setting my acceleration slider to 5 (0 - 5 scale): Where 5 means: "No hardware accelerations are allowed. The driver will only be called to do bit-block transfers from a system memory surface to the screen." Nearest Neighbour: 22 seconds Bilinear: 25 seconds High Quality Bilinear: 38 seconds Bicubic: 123 seconds HighQuality Bicubic: 35 seconds Hmmm, a relatively constant delta of around 13-15 seconds for each compared to accelerations on.
Comment 68•22 years ago
|
||
Some more info on GDI+: I did a quick search of groups.google.com on the microsoft gdi newsgroups and came across a couple of interesting items: 1) There is an MS Knowledgebase article regarding mixing and matching GDI/GDI+. It is titled "INFO: Interoperability Between GDI and GDI+" (Q311221). It explains some things to watch out for if you want to use both (which sounds feasible). The link is: http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q311221 2) In a different newsgroup article (dated May 2002), one of the MS support guys made a comment about performance of gdi versus gdi plus as follows: -- start excerpt -- "GDI+ is not GDI. GDI+ v1 has more features and less hardware acceleration. This can result in a perception of "slower" execution. Actually, your test compares apples with oranges - GDI+ code could be doing antialiasing, can handle non-integer coordinates, and doesn't have it's own DDI. If you need hardware acceleration and speed, and don't need the new features in GDI+, then continue to use GDI." -- end excerpt -- The link to this article (so you can get full context) is: http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&selm=v3UKD%23BCCHA.2768%40cpmsftngxa08 So in spite of what the docs say, true hardware accel (like you might get with directx ) may not be here yet. If performance is good enough for the operations of interest, given the fact that you get their implementation "free of charge"... then go for it. His comment also explains why I could not find any references to GDI+ in my Windows DDK docs.
Assignee | ||
Comment 69•22 years ago
|
||
Here's the dll http://mozilla.animecity.nu/gkgfxwin-Interpolated.zip It *only* works for 1.3b release (and who knows, it may not work on YOUR 1.3b, don't blame me if it doesn't). It will not work for a nightly a day after, a day before, etc. (unless you get lucky). Move the old gkgfxwin.dll someplace safe (don't just rename it to another name with a .dll extension and keep it in the components dir, Mozilla will find it!), and unzip this one. Again, the GDIPlus download may be needed if you are on an older OS (95/98/ME/2k) http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=BFC0B436-9015-43E2-81A3-54938B6F4614 Its default is set to mode 7 (InterpolationModeHighQualityBicubic) You can change this by adding a line to your user.js, _and_ restarting mozilla: user_pref("image.interpolationMode", v); Where v is one of the folowing _numbers_: // None (BitBlt) -1 // InterpolationModeDefault 0 // InterpolationModeLowQuality 1 // InterpolationModeHighQuality 2 // InterpolationModeBilinear 3 // InterpolationModeBicubic 4 // InterpolationModeNearestNeighbor 5 // InterpolationModeHighQualityBilinear 6 // InterpolationModeHighQualityBicubic 7 (Default) Here's a page to test performance on: http://mozilla.animecity.nu/IMGTest/BigImageDraw.html Follow the instructions, write down your PER values and compare the modes. Or just try resizing your window, or swishing another window overtop the image, or pressing the down arrow 10 times and then the up arrow 10 times. For those who don't want to download and try, you can see the quality differences in the modes here: http://mozilla.animecity.nu/IMGTest/images/InterpolationModes/ Open each one up on a new tab, and you can Ctrl-PGUP, Ctrl-PGDN between them and get a good idea which modes suck. My speed results are: Mode 'PER' Speed -1 102ms BitBlt 0 645ms Default 1 643ms LQ 2 1027ms HQ 3 645ms Bilinear 4 843ms Bicubic 5 619ms NearestNeighbour 6 1067ms HQ Bilinear 7 1072ms HQ Bicubic putting -1, 4, and 7 on 3 tabs and flipping between them gives you a cool "bad to good" look :) Anyway, the fastest the Interpolation Modes do is still 6 times slower than our crappy bitblt. There may be ways to get that down.. but I'm not holding my breath on getting it down by 6x, or even to 2x the speed of bitblt. Without using a cache, that is.
Comment 70•22 years ago
|
||
With the new gkgfxwin.dll I ran the tests from comment #68 on my machine (AMD K7-850MHz, Win2K, GeForce2, 1280x1024x32) with the following results: Mode 'PER' Speed -1 60ms BitBlt 0 790ms Default 1 788ms LQ 2 1270ms HQ 3 790ms Bilinear 4 1046ms Bicubic 5 774ms NearestNeighbour 6 1363ms HQ Bilinear 7 1282ms HQ Bicubic Sigh... an order of magnitude slower: - Do we know if the GDI+ modes being used match the internal BitBlt modes (for example we are not alpha blending and anti-aliasing in one case and not the other)? I suspect this is not the issue, but should be asked. It doesnt really appear that GDI+ is "currently" doing any hardware acceleration. I would think that the BitBlt should compare to mode 5 Nearest Neighbour if it was. So what would we gain from using GDI+? ... probably just some implementation time with hope of future acceleration??? With the above numbers it would seem that we would probably only want to consider using it in certain constrained user preference situations.
Comment 71•22 years ago
|
||
I did what you said on 1.3b, restarted Mozilla, had the pref on -1, and Whenever I hit F5, it would show mode 7. If anyone has the same problem and figures out why, please let me know.
Assignee | ||
Comment 72•22 years ago
|
||
You probably have to force a profile with the -P commandline. I made the mistake of reading the pref only once, and if the profile manager pops up first, default prefs will be read and the profile prefs will never get read.
Comment 73•21 years ago
|
||
*** Bug 198828 has been marked as a duplicate of this bug. ***
Comment 74•21 years ago
|
||
I would like to stress that I think this bug has risen in terms of severity, since it is not a pure enhancement anymore: Some images, especially maps ("how to find us"), which are downscaled by the "automatic image resize" feature become unreadable because of the bad algorithm used. IMO this makes "auto image resize" look like a half-hearted feature, so this needs to be fixed, if only for "auto image resize".
Comment 75•21 years ago
|
||
Indeed. Esp. if you look at IE 6.0, which has auto-shrink the image, but if you don't want that then you can display the image at native resolution with one of the hovering buttons. Mozilla either should have a button like that, or a better scaling algorithm, or both (ideally).
Comment 76•21 years ago
|
||
>Mozilla either should have a button like that
it has. click on the image.
Comment 77•21 years ago
|
||
Using these algorithms for auto-image scaling would not have any significant performance impact, so it is a good match for the best algorithm. Using it for scaling in web pages should be user choice. Maarten: We already have that. Just click on the image when you see the funky move cursor (needs to be changed). The most annoying feature on IE is that image toolbar that appears above images on regular web pages. It blocks my dad's stock graphs. Please don't do anything like that.
Comment 78•21 years ago
|
||
Since Benjamin seems to be willing to do the work....
Assignee: pavlov → benjamin
Comment 79•21 years ago
|
||
Hey, your'e a funny guy, Boris... I can't program worth sh*t (see http://www.streeck.com/2000bc). So I'm not able to help that actively -- being in charge of bugs is WAY beond me. I considder myself a user, tester and web-designer. If in the future you would like me stay out of your way and not try to help Mozilla stay the best browser out there, then say so, and I will take my (I hope) constructive criticism somewhere else.
Assignee: benjamin → bzbarsky
Comment 80•21 years ago
|
||
Reassigning to Paper since he has created a patch that actually does something. Benjamin: That fractal generator looks impressive from the screen shots. I once wrote a fractal program myself when I was about 16, but it only did Mandlebrot. Fractals rock! :-)
Assignee: bzbarsky → paper
Comment 81•21 years ago
|
||
*** Bug 201017 has been marked as a duplicate of this bug. ***
Comment 82•21 years ago
|
||
*** Bug 203526 has been marked as a duplicate of this bug. ***
Comment 83•21 years ago
|
||
Like I said in the most recent dupe (sorry), I think the proper way to do this is like the Viewer in Mac OS X does it: first draw the nearest line (BitBlt) resized image, then, when done resampling using a slower algorithm, redraw over it with a smooth image. Performance an order of magnitude slower with loss of interactivity warrants this.
Updated•21 years ago
|
Summary: Prettier image scaling (Bilinear, Bicubic, anything better than Nearest Color) → Prettier image resizing & scaling (Bilinear, Bicubic, anything better than Nearest Color)
Comment 84•21 years ago
|
||
how about a css property for this?
Comment 85•21 years ago
|
||
You mean a moz_* property for XUL?
Comment 86•21 years ago
|
||
I too would like to see bicubic scalling in mozilla (firebird). When making some html list of my music album cover scans I ran into images that were totally unrecognizable with current resizeing. Therefore bicubic scalling would be a very nice feature; a feature opera has with its "Smooth zooming of images" option...and the result is from another world that what mozilla (and most other) programs performs. The problem is only noticeable when you scale a lot (huge image --> small image) so wouldn't it be possible to only use bicubic scalling when a lot of scaling is needed?
Comment 87•21 years ago
|
||
You can have a look at the huge difference it makes here: http://fb2k-plugins.hydrogenaudio.org/test/resize.jpg
Comment 88•21 years ago
|
||
Isnt' bicubic resizing only advantageous over bilinear resizing when you're making images bigger?
Comment 89•21 years ago
|
||
*** Bug 213089 has been marked as a duplicate of this bug. ***
Comment 90•21 years ago
|
||
*** Bug 215782 has been marked as a duplicate of this bug. ***
Comment 91•21 years ago
|
||
So, the bug pushing two years and the solution being about 3x10 lines of code or so, when will we see this?
Comment 92•21 years ago
|
||
One argument against implementing this is that webmasters should size images correctly for their use; if they don't and they look bad because mozilla can't draw resized images well, that's just incentive for Getting It Right in the first place. I suggest that mozilla implement better image drawing as in this bug, but also show a '+' magnifying-glass icon in the corner of all missized images or (better) change the cursor to a magnifying glass as is done in resizing images to fit in a browser, to indicate that the image as displayed is sub-optimal and that 'view image' should be selected from a context menu to get a better look. The presence of the changed cursor should encourage correctly-sized images, decreasing long-term browser rendering load...
Comment 93•21 years ago
|
||
One argument for fixing this is when you are resizing stand-alone images. There are some cases where this is alright in a web page, for instance if an image is within a div and it is shown floated to the right in a small size, and when you click on it appears full size. Its true that they could have had a small image and then within javascript loaded the larger image and done a replacement, but sometimes that would be more work than is necessary for a, let's say, 3KB difference in image size, and there might be a reason they want to do it that way. Another good argument is for full zoom for a web page. Therefore, its better to teach better web development techniques than punish everyone because a few people might abuse this.
Comment 94•21 years ago
|
||
*** Bug 223610 has been marked as a duplicate of this bug. ***
Comment 95•21 years ago
|
||
See bug 228085 - Enable prettier image scaling and resizing for stand-alone images
Comment 96•21 years ago
|
||
*** Bug 228085 has been marked as a duplicate of this bug. ***
Comment 97•20 years ago
|
||
Opera 7.5 has a "Smooth zooming of images" option that uses bilinear or bicubic resampling. I can't say that it helps scaled images look much better, though.
Whiteboard: has code to be incorporated! → [parity-opera] has code to be incorporated!
Comment 98•20 years ago
|
||
While we will need to scale on the fly, is there anything we can do post page/image render (i.e. after the image or page is fully rendered) during idle time to speed up possible future zooming? Perhaps for images within a web page, we can initially do a normal scale of the image, then do a resampling of the image using bilinear. Context-menu options could allow them to choose other options. The reason I say this is that bilinear rescaling when the user initially displays the page might be overkill. They might immediately click a link, and its better to resample after so the operations can be ended if the user so chooses. Some resampling will be unecessary. Could we have fast code to determine if its necessary? Could we filter images during download? For web pages, this would work a lot better if there could be some placeholder for the images so the rest of the page could be rendered. Could the image library spit out before the entire image is rendered the size of the image that it gets from the image header so a frame can be built for it before the image has been totally downloaded? That way users won't have to wait to read content if an image isn't fully downloaded and re-sampled.
Comment 99•20 years ago
|
||
(In reply to comment #98) > Context-menu options > could allow them to choose other options. Yes, add some options to the context menu that very few people even understand and even fewer have a use for. > Could the image library spit out before the > entire image is rendered the size of the image that it gets from the image > header so a frame can be built for it before the image has been totally > downloaded? Have you browsed the web recently? The image library does do that. That's why Mozilla can show a placeholder for the image (with the right size) before it is downloaded.
Comment 100•20 years ago
|
||
Biesi: My connection is too fast to notice. All I know is there was a bug open
not too recently about incremental rendering of pages and images, and a lot of
people complaining about it. I guess either I'm confused, or its been fixed. Is
there a way to throttle our bandwidth through the browser so we can see this?
Anyway, if the download is slow, we can be doing resampling during the download.
Otherwise, we can show it using poor scaling, then resample it in-place.
>Yes, add some options to the context menu that very few people even understand
>and even fewer have a use for.
So you suggest a one-size-fits-all solution on diverse platforms? If we even
attempt a one-size-fits-all solution, we'll need adaptive code. It seems like an
incredible waste of processor time to do sampling that a user doesn't want.
Comment 101•20 years ago
|
||
Any progress?
Patch has bitrotted - didn't apply cleanly to my source tree.
Updated•20 years ago
|
Summary: Prettier image resizing & scaling (Bilinear, Bicubic, anything better than Nearest Color) → Prettier image resizing & scaling (Bilinear, Bicubic, anything better than Nearest Neighbor)
<CTho|away> rocWork: what needs to happen for 98971? <rocWork> someone would need to convert the code so that it loads the GDIPLUS library dynamically <rocWork> rather than just barfing if it's not found, which the current code would do <rocWork> then we'd need to test performance, see if it regresses Tp
Comment 104•20 years ago
|
||
*** Bug 268375 has been marked as a duplicate of this bug. ***
Comment 105•20 years ago
|
||
I have a few comments on this I hope may be useful. When considering performance, these algorithms will often need to sample up as well as down – something that has not been benchmarked or even mentioned. This bug has been referenced several times by bug 4821 which promises a page zoom function and I came across it after using Jason Adams’ nicely designed ImageZoom extension – both require upsampling. Caching has been discussed – either recalculate on the fly every time the image is displayed (performance hit) or render the entire page to memory once and use that when scrolling (too memory intensive). What about a disk cache with short persistence, purely for resampled images? It could be cleared after 24 hours, as the browser is closed or even after navigation away from the page. It wouldn’t need to be part of the normal browser cache. It has been suggested that the processing be done during download because the download will take longer. Does anybody know if the libraries likely to be used for this will allow incremental streaming of images for processing? It seems unlikely to me. There will be an additional problem dealing with interlaced images. In addition, don't forget users who are on a fast intranet or viewing images loaded from their cache - download times will be substantially reduced or nil. For this reason, and the substantially larger requirement for instant gratification on a zoom request, it seems to me that the approach most likely to find favour with users is to display the quick and dirty image created using the BitBlt algorithm first and start a new thread to process the image more accurately to replace it – either one thread per image or one thread with a queue of images requiring resampling. Adobe Reader does something like this when rendering new parts of the page after scrolling. Ideally, the new thread would be interrupted if the image size was altered again through a zoom event of some sort. Lastly (and I think I’m in agreement with most commentators here), the presence of “smooth resizing” should certainly be a user option. Variations in libraries (or home-grown code execution time) and eventual hardware acceleration between platforms will make the performance of this feature vary greatly and with it, its desirability. Whether altering the algorithm (if this is even possible) should be in the main control panel I’m less sure about. Probably this should default to bicubic (which seems surprisingly superior to bilinear, at least for size reduction) and different algorithms could be selected in about:config. Just to confuse matters, there are, of course, other algorithms such as Lanczos and Xin Li that could be considered. I know nothing about these.
Assignee | ||
Comment 106•20 years ago
|
||
update hack patch to trunk (with pref loading) See Comment #69 for Interpolation Modes, and Test Case. Changing image.interpolationMode (via about:config) doesn't require restarting Moz to have the changes come into effect. Also note that if only a section of the image needs updating, the hack uses GDI+ to pretty-draw to the dirty area, which leaves the edges lacking some interpolation. To fix this, the dirty area would have to be expanded by a pixel or two on each side. To restate what I've said in prior comments: A cache of the resized image is the only viable option. On the fly is just to slow. (In reply to Comment #105) >Does anybody know if the libraries likely to be used >for this will allow incremental streaming of images for processing? GDI+ will not, and GDI+ is what we should be using (or a similar OS native library), since, in theory, the graphics card could do all the processing.
Attachment #112485 -
Attachment is obsolete: true
Comment 107•19 years ago
|
||
*** Bug 266752 has been marked as a duplicate of this bug. ***
Comment 108•19 years ago
|
||
(In reply to comment #103) > <rocWork> someone would need to convert the code so that it loads the GDIPLUS > library dynamically > <rocWork> rather than just barfing if it's not found, which the current code > would do ArronM, could you make it silently fall back to the default if GDI+ is not found, as mentioned above? Another issue: as other platforms will use other libraries (e.g. Cairo), the pref values should be somehow abstracted away from GDI+. Perhaps something as simple as Default/Low Quality/Medium/High, which is mapped to real algorithms for each library.
Comment 109•19 years ago
|
||
I'd like to see this happen ASAP so I can use natural units on images... when SVG takes off in Fx 1.5 I don't wanna have to enclose my raster graphics in SVG to have them nicely scalable! :S I am getting sick of having to mix pixel measurements when playing with images, with natural units when playing with fonts, as anyone with different DPI settings will see a mess. If Fx had proper support for this, it really /would/ be a leg up on IE because I for one would develop sites that use this technique. Alex
Comment 110•19 years ago
|
||
Opera 7.5 had a "smooth zooming of images" option. In Opera 8.5, there is no option; this is the default behaviour. The improvement is *very* noticeable when looking at small thumbnails of human faces in e.g. staff directories (edges of glasses, highlights in eyes) -- I think Opera must have the online dating crowd sewn up. People look better in Opera.
Comment 111•19 years ago
|
||
New and useful application for image subsampling: the Viamatic foXpose 0.2 plugin gives a MacOSX-Expose-like view of what's in all tab windows in a single page as clickable thumbnails, via a little control in the bottom-left corner (or a hotkey). It's a lifesaver for finding your way around tabs. These thumbnails would look far better and more readable with image subsampling. https://addons.mozilla.org/extensions/moreinfo.php?application=firefox&id=1457 http://viamatic.com/firefox/ Seems pretty clear to me that Firefox should include code resolving this bug and build in the foXpose extension to take advantage of it asap!
Comment 112•19 years ago
|
||
*** Bug 319187 has been marked as a duplicate of this bug. ***
Comment 113•19 years ago
|
||
*** Bug 319918 has been marked as a duplicate of this bug. ***
Comment 114•19 years ago
|
||
Comment 115•19 years ago
|
||
For what its worth, this gets a lot better with the cairo stuff coming soon.
(In reply to comment #115) > For what its worth, this gets a lot better with the cairo stuff coming soon. > WFM Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060309 SeaMonkey/1.5a
Comment 117•18 years ago
|
||
The scaling looks much better in Cairo, but it does not look as good as with paint or another good picture-editor. Do we want to improve the scaling or is this fixed now?
Comment 118•18 years ago
|
||
which interpolation algorithm is used with cairo to resize images?
Comment 119•18 years ago
|
||
According to Bug 324698 Comment 10 the algorithm is still nearest neighbor so this bug is still relevant. Here is another testcase: http://couven.dyndns.org/if12-R%fc/mathe-projekt/Jonny/test/test.htm
Comment 120•18 years ago
|
||
(In reply to comment #119) > According to Bug 324698 Comment 10 the algorithm is still nearest neighbor so > this bug is still relevant. the _downsampling_ algorithm is nearest neighbour. upsampling uses a better one but I don't know which one.
Comment 121•18 years ago
|
||
*** Bug 331074 has been marked as a duplicate of this bug. ***
Comment 122•18 years ago
|
||
Somebody might want to look at http://www.virtualdub.org/blog/pivot/entry.php?id=86 :) Also, in said project (or in avisynth) you have a fast resizer with lots of methods that obey these rules, and also very fast high quality 2x-downscaling filters (not just 2x2 average). For the speed issues - I think a good compromise, which MS Office uses since ages ago (*) is having a limited size resized image cache. So you can keep the relatively recent seen resized images cached. Think around 1-4 megs, or a small % (or log) of the RAM, like the memory cache already does now. (*) I think this was documented in the help file, but I can't find it in recent versions. The size of the cache was specified, and it is very evident if you have a slow CPU and knew where to look, as sometimes it runs very fast but hitches when a new image comes into view, and sometimes tha cache can't hold all the images in the current view and always runs slow.
Comment 123•18 years ago
|
||
*** Bug 331968 has been marked as a duplicate of this bug. ***
Comment 124•18 years ago
|
||
I'll just point out that the Mediawiki codebase contains an algorithm to make lovely thumbnails. I'm not sure if it's bilinear, but the results speak for it, and it must be legal. As for performance, that remains to be seen...
Comment 125•18 years ago
|
||
Mediawiki uses ImageMagick ( http://www.imagemagick.org ). I'm dont know if we can or want include it in Mozilla. Just curious: What happens when an image is upscaled in one direction and downscaled in the other? Which algorithm is used then? Maybe we could just use only one algoritm for both downscaling and upscaling?
Flags: blocking1.9a1?
Comment 126•18 years ago
|
||
Cairo (on the trunk) has a nicer resizing algorithm.
Comment 127•18 years ago
|
||
For downscaling (which occurs when Mozilla/Firefox have "Resize large images to fit in the broser window" turned on), there exists a nice algorithm that's faster then bilinear and produces comparable results. It's implemented in gdk-pixbuf: http://developer.gnome.org/doc/API/gdk-pixbuf/gdk-pixbuf-scaling.html "GDK_INTERP_TILES This is an accurate simulation of the PostScript image operator without any interpolation enabled. Each pixel is rendered as a tiny parallelogram of solid color, the edges of which are implemented with antialiasing. It resembles nearest neighbor for enlargement, and bilinear for reduction."
Comment 128•18 years ago
|
||
*** Bug 343952 has been marked as a duplicate of this bug. ***
Comment 129•18 years ago
|
||
This can be surprising to many people, but in IE7 Microsoft is offering a CSS extension (yes with ms- prefix!!!) to choose the interpolation method: http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/msinterpolationmode.asp (no, I haven't tested it and can't offer a screenshot, sorry)
Comment 130•18 years ago
|
||
Adding parity-IE to status now IE7 has this.
Whiteboard: [parity-opera] has code to be incorporated! → [parity-opera] [parity-IE] has code to be incorporated!
Comment 131•18 years ago
|
||
*** Bug 347388 has been marked as a duplicate of this bug. ***
Comment 134•18 years ago
|
||
I can't believe that a serious design flaw that was reported almost 6 years ago is still not fixed today. Many downsized photos look really **** after downsizing with the Windows version Firefox or Internet Explorer while Opera does it right. I have heared that the OS X version of Firefox does a correct job too. You often don't have any control about the size of the images you have to work with. And the 3456 pixel originals of a Canon 350D are really useless on a 1600 or 1280 pixel monitor without downsizing. So there are thousands or even millions of web pages out there that look really **** if they are visited with something else than Opera. Some examples for applications where this problem is very noticable are the <a href=http://www.flickr.com/groups/flickrhacks/discuss/72157594424414882>High Res Flickr greasemonkey script</a> and the <a href=http://www.tinou.com/flickrslideshow.jsp?tag=downscalingbugexample&username=&nsid=&size=screen&delay=5&sort=date-posted-desc&random=no&bgcolor=white&fsborder=60>flickr slide show</a> by Tinou Bao. I recently tested downscaling with version 2.0.0.1 but I rember that version 1.x had the same problems. Many images are noticably degraded in quality if they are downsized in the bwrowser. In some even as bad that the images are essentially destroyed. You can see such a problem in my first example. Reproducible: Always Steps to Reproduce: 1. See any webpage that forces the browser to downscale an image and compare it with a downscaled version of the image done by properly working software. Almost every photo software will do a correct job. In some programs you have to configure the the use of a better downscaling algorithm for on the fly downscaling for your display. You can see two examples here: http://www.flickr.com/groups/highres_favorites/discuss/72157594472370749/ Actual Results: Getting even more disgusted at the firefox downscaling performance after seing the horrible results in my first example. Expected Results: The image quality I see for downscaled images in just about every other photo program or the Opera web browser. It should have used an more intelligent downscaling algorithm than the one actually employed here. Opera 9.02 does a good downscaling job. There is no difference visible compared to the downscaled version provided by flickr.
Comment 135•18 years ago
|
||
(In reply to comment #134) > I can't believe that a serious design flaw that was reported almost 6 years ago > is still not fixed today. It's really not that serious, and I wouldn't call it a design flaw to begin with. That being said, Firefox 3 will use Cairo for graphics, which fixes this issue. (Sorry about the bugmail, everyone.)
Comment 136•18 years ago
|
||
What's missing on trunk to mark this bug fixed?
Comment 137•18 years ago
|
||
I don't understand why the developers consider it no big deal that millions of users get substandard images delivered because the developers could not spend a few minutes of programming time to include a decent quality downscaler into the code. For me this design feature makes Firefox almost unusable. The only reason that I have not yet switched to Opera full time is that I have not yet figured out how to get greasemonkey scripts running on Opera.
Comment 138•18 years ago
|
||
I'll mark this bug fixed, because we do have "anything better than Nearest Neighbor". Please reopen if I'm missing something. Andreas Helke, don't add comments if you have nothing to say.
Status: NEW → RESOLVED
Closed: 18 years ago
Keywords: helpwanted
Resolution: --- → FIXED
Whiteboard: [parity-opera] [parity-IE] has code to be incorporated! → [parity-opera] [parity-IE]
Target Milestone: Future → mozilla1.9alpha
Comment 140•18 years ago
|
||
As I understand it, trunk is using bilinear filtering for upscaling images, but downscaling is still nearest neighbour.
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
Comment 141•18 years ago
|
||
Justin, I did test that briefly with <http://farm1.static.flickr.com/155/329582545_dc352afc52_o.jpg>. It gives me a better result than 1.8.1. If you can verify that, please re-resolve this bug as FIXED.
Comment 142•18 years ago
|
||
Dao, your test image looks awful downsampled in Firefox 2.0.0.1 -- all those diagonal roof edges. We don't have parity with Opera or IE yet, either.
Comment 143•18 years ago
|
||
I tested with trunk and there is still considerable aliasing indicative of nearest neighbor.
Comment 144•18 years ago
|
||
Test with http://people.mandriva.com/~prigaux/language-study/diagram.png - there is some kind of filtering being done because grays appear when it's scaled, but the result is horrible compared to any of the filters in IrfanView.
Comment 145•18 years ago
|
||
Looks anti-aliased to me. Jason, please don't guess whether it's nearest neighbor or not but verify it.
Comment 146•18 years ago
|
||
(In reply to comment #144) > Test with http://people.mandriva.com/~prigaux/language-study/diagram.png - > there is some kind of filtering being done because grays appear when it's > scaled, but the result is horrible compared to any of the filters in IrfanView. Doesn't look too different from Opera, but still worse. IMO you should file new bugs for further enhancement requests or regressions, but this bug should be fixed according to its summary. Here's no real work going on anyway -- much noise about nothing.
Comment 147•18 years ago
|
||
Right. It helps if I actually test trunk and not 1.8.1.1. :( The diagram linked in #144 does indeed show there is clearly some interpolation with trunk. I suppose strictly speaking this bug it could be closed, but I think there is still room for improvement here.
Resolving fixed based on conversation in #gfx. (In reply to comment #137) > I don't understand why the developers consider it no big deal that millions of > users get substandard images delivered because the developers could not spend a > few minutes of programming time to include a decent quality downscaler into the > code. The developers are out to get you.
Status: REOPENED → RESOLVED
Closed: 18 years ago → 18 years ago
Resolution: --- → FIXED
Updated•18 years ago
|
Status: RESOLVED → VERIFIED
Comment 152•17 years ago
|
||
(In reply to comment #146) > (In reply to comment #144) > > Test with http://people.mandriva.com/~prigaux/language-study/diagram.png - > > there is some kind of filtering being done because grays appear when it's > > scaled, but the result is horrible compared to any of the filters in IrfanView. > > Doesn't look too different from Opera, but still worse. IMO you should file new > bugs for further enhancement requests or regressions, but this bug should be > fixed according to its summary. Here's no real work going on anyway -- much > noise about nothing. > Done Bug 372462
Comment 154•17 years ago
|
||
(In reply to comment #148) > Resolving fixed based on conversation in #gfx. How exactly is this fixed? I don't think any of the patches in this bug have been checked in. If another (probably Cairo-related) bug fixed this, this bug should be duped against that bug. If it's unknown which bug fixed this, this bug should be marked WORKSFORME.
Comment 155•17 years ago
|
||
Hopefully a helpful note for folks finding this bug - the bug was "fixed" in Firefox 3.0 ("Gran Paradiso") by moving to a new graphics rendering engine called Cairo. If you're using Firefox 2.* you will still see very chunky/ugly downsampled graphics. This is verified fixed (and pretty!) in Firefox 3.*.
Comment 156•17 years ago
|
||
Actually, better upscaling got backed out on the trunk due to some issues with it. See bug 381661 for more information.
Comment 157•17 years ago
|
||
Ryan - thanks for the clarification - it's smooth *downscaling* that is fixed in 3.0 and not fixed in 2.0.
Comment 158•17 years ago
|
||
Hm, staring until my eyes bled with trunk 20070614 I could not find or reproduce chunkiness in the image upscaling or find inferiority to IE7 / Photoshop upscaling. Perhaps this got quietly fixed in Cairo? Noting this on bug 381661. Let's carry upscaling discussion there.
You need to log in
before you can comment on or make changes to this bug.
Description
•