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 行では、Web ページに画像の読み込み時に画像のサイズを検出させるのではなく、画像の幅と高さを通知していることを理解しています。これにより、レイアウトが高速になり、ユーザーの目の前で Web ページが飛び回る煩わしさが回避されます。
➥ 私の質問は次のとおりです。高密度のピクセルを備えた最新のモニター、 Apple がRetinaディスプレイと呼んでいるものについてはどうですか?
画像がすべてのピクセルを効果的に表示し、画面上のスペースを最小限に抑えるにはどうすればよいですか?
モニターのピクセル密度が昔ながらの低さである場合、技術的にはすべての画像のピクセルを表示しながら、画像が占める画面のセンチメートルが少ない高密度の Retina ディスプレイよりも、物理的な画面スペースがより多くのセンチメートルで画像を表示する必要があります。