在Vaadin 14应用程序中为像素密集(“ Retina”)监视器设置“图像”小部件的尺寸

问题描述 投票:1回答:2

我知道如何在Vaadin 14.1应用程序中在屏幕上呈现JPEG图像。

特别是3行:

imageReader.setInput( imageInputStream ); // Render the image from the data provided by the `ImageInputStream`.
imageWidget.setWidth( imageReader.getWidth( 0 ) + "px" ); // Get the pixel size of the rendered image.
imageWidget.setHeight( imageReader.getHeight( 0 ) + "px" );

…此:

private Image createImageWidget ( String mimeType , String fileName , InputStream inputStreamOfImageData )
{
    if ( mimeType.startsWith( "image" ) )
    {
        Image imageWidget = new Image();
        try (
                inputStreamOfImageData ;
                // Auto-close.
        )
        {
            // Get the octets of the image data.
            final byte[] bytes = IOUtils.toByteArray( inputStreamOfImageData );

            // Make the image widget for Vaadin.
            imageWidget.getElement().setAttribute( "src" , new StreamResource( fileName , ( ) -> new ByteArrayInputStream( bytes ) ) );
            imageWidget.setAlt( "File name: " + fileName );

            // Size the image for display in the HTML/CSS for faster rendering without the page layout jumping around in front of user.
            try (
                    ImageInputStream imageInputStream = ImageIO.createImageInputStream( new ByteArrayInputStream( bytes ) ) ;
                    // Auto-close.
            )
            {
                // Apparently, image readers (parsers/decoders) are detected at runtime and loaded via the "Java Service Provider Interface (SPI)" facility.
                final Iterator < ImageReader > imageReaders = ImageIO.getImageReadersByMIMEType( UploadView.MIME_TYPE_JPEG );  // OR, for multiple image types, call `ImageIO.getImageReaders( in )`.
                if ( imageReaders.hasNext() )
                {
                    ImageReader imageReader = imageReaders.next();
                    try
                    {
                        imageReader.setInput( imageInputStream ); // Render the image from the data provided by the `ImageInputStream`.
                        imageWidget.setWidth( imageReader.getWidth( 0 ) + "px" ); // Get the pixel size of the rendered image.
                        imageWidget.setHeight( imageReader.getHeight( 0 ) + "px" );
                    }
                    finally
                    {
                        imageReader.dispose();
                    }
                } else
                {
                    throw new IllegalStateException( "Failed to find any image readers for JPEG. " + "Message # e91ce8e4-0bd3-424d-8f7c-b3f51c7ef827." );
                }
            }
        }
        catch ( IOException e )
        {
            e.printStackTrace();
        }
        return imageWidget;
    }
    // TODO: Log error. Should not reach this point.
    System.out.println( "BASIL - ERROR - Ended up with a null `imageWidget`. " + "Message # 415bd917-67e2-49c3-b39a-164b0f900a3a." );
    return null;
}

我了解,在这3行中,我们是在通知网页图像的宽度和高度,而不是让网页在加载图像时发现图像的尺寸。这使布局更快,并避免了网页在用户面前跳来跳去的烦恼。

➥我的问题是:关于像素密度高的现代显示器,Retina像苹果公司所说的那样呢?

如何获取图像以有效显示其所有像素,但占用屏幕上的空间最少?

如果显示器具有老式的低像素密度,则图像显示的物理屏幕空间应该比高密度Retina显示器显示的屏幕要大一厘米,在高密度的视网膜显示器上,图像在占据技术上仍显示所有像素的同时,可以占用更少的厘米屏幕。

image vaadin retina-display vaadin-flow pixel-density
2个回答
1
投票
但是,如果出于某种原因要自行计算相对大小,则可以通过以下方式获取浏览器窗口的大小:

img

© www.soinside.com 2019 - 2024. All rights reserved.