我知道如何在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显示器显示的屏幕要大一厘米,在高密度的视网膜显示器上,图像在占据技术上仍显示所有像素的同时,可以占用更少的厘米屏幕。