Displaying pixel-perfect images without blur when zooming
Felipe Heidrich
felipe.heidrich at oracle.com
Tue Aug 26 22:29:46 UTC 2014
>
> I'm curious. Why setSmooth doesn't work?
>
I tried setSmooth but it doesn’t work.
See the doc: "Indicates whether to use a better quality filtering algorithm or a faster”.
I expected this be a set for the interpolation algorithm (bilinear, bicubic, nearest neighbor, etc).
My case I didn’t want a faster filter, I wanted no filter.
Anyway, looking at the code, at the rendering level, NSImageView:
// RT-18701: this method does nothing
public void setSmooth(boolean s) {}
> Also, do I really need to create an image in memory just to render something showing the pixels?
>
For a workaround done outside JavaFX I can’t think of any other way.
I used this code snippet for a simple testing app, small images.
Felipe
> On Aug 27, 2014 3:32 AM, "Nico Krebs | www.mensch-und-maschine.de <http://www.mensch-und-maschine.de/>" <nicokrebs.dev at googlemail.com <mailto:nicokrebs.dev at googlemail.com>> wrote:
> Thanx for that quick response!
>
> It is the right direction, but doing this for one image is not enough.
> when having multiple images, the distances between them must be scaled,
> too.
>
> I will extend your example to scale all nodes and their positions, too.
> I try it tomorrow and post the result here.
>
> Nico
>
> > Felipe Heidrich <mailto:felipe.heidrich at oracle.com <mailto:felipe.heidrich at oracle.com>>
> > 26. August 2014 19:20
> >
> > Hi Nico,
> >
> > Is this what you looking for:
> >
> > Image image - the image to scale up
> > int width = (int)image.getWidth();
> > int height = (int)image.getHeight();
> >
> > int z = (int)getZoom(); // 2, 4, 8, 16 (I only tested for powers of two)
> > IntBuffer src = IntBuffer.allocate(width * height);
> > WritablePixelFormat<IntBuffer> pf =
> > PixelFormat.getIntArgbInstance();
> > image.getPixelReader().getPixels(0, 0, width, height, pf, src,
> > width);
> > int newWidth = width * z;
> > int newHeight = height * z;
> > int[] dst = new int[newWidth * newHeight];
> > int index = 0;
> > for (int y = 0; y < height; y++) {
> > index = y * newWidth * z;
> > for (int x = 0; x < width; x++) {
> > int pixel = src.get();
> > for (int i = 0; i < z; i++) {
> > for (int j = 0; j < z; j++) {
> > dst[index + i + (newWidth * j)] = pixel;
> > }
> > }
> > index += z;
> > }
> > }
> > WritableImage bigImage = new WritableImage(newWidth, newHeight);
> > bigImage.getPixelWriter().setPixels(0, 0, newWidth,
> > newHeight, pf, dst, 0, newWidth);
> > preview.setImage(bigImage);
> > preview.setFitWidth(newWidth);
> >
> >
> > preview is ImageView where the scale up image is displayed.
> >
> >
> > Felipe
> >
> >
> >
>
> --
> Nico Krebs
>
> Michelangelostraße 1
> 01217 Dresden
>
> web: www.mensch-und-maschine.de <http://www.mensch-und-maschine.de/>
> mobil: 0162 / 85 89 667
> mail: nicokrebs.dev at googlemail.com <mailto:nicokrebs.dev at googlemail.com>
> skype: k-dottus
> icq: 324 143 104
> fax: 032 12 - 11 39 77 6
> twitter: nico_krebs
More information about the openjfx-dev
mailing list