Я знаю, как отобразить изображение JPEG на экране в приложении Vaadin 14.1.
В частности, 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 отображается так, как их называет Apple?
Как получить изображение для эффективного отображениявсе его пиксели, но занимают наименьшее пространство на экране?
Если монитор имеет старомодную низкую плотность пикселей, изображение должно отображаться с большим количеством сантиметров физического пространства экрана, чем на дисплее Retina с высокой плотностью, где изображение может занимать меньше сантиметров экрана, при этом все же технически отображая всепиксели изображения.