php改变jpg图片dpi_【前端技术】Web端高dpi图片适配方案

本文介绍了针对高dpi显示屏的Web前端图片适配方案,包括JavaScript选择图片加载、服务端选择加载、CSS媒体查询、浏览器新特性(如image-set和srcset)等方法,并提出了使用SVG和CSS结合现代浏览器特性作为最优方案。同时提到PHP改变jpg图片DPI在项目中的应用。
摘要由CSDN通过智能技术生成
89aa2188ce5dc7d9177711b8974dd96e.png

最近经手一个web项目,需要考虑前端多种尺寸屏幕的图片适配问题,也是关于ui设计导出1X&2X切图如何使用的方法,现在整理一下高dpi屏幕的web端适配方案,希望对大家能有帮助。

面向高dpi显示屏的适配方案主要有以下几种:

1、javascript选择图片进行加载

方法:通过 window.devicePixelRatio 获取设备像素比率,获取屏幕宽度和高度,甚至可能通过navigator.connection或发出假请求,如foresight.js库做一些网络连接嗅探。收集所有这些信息后再决定要加载哪个图片。

优点:兼容低版本浏览器

缺点:图像加载会有延迟

2、用服务端选择加载图片

方法:为每个图片编写自定义请求处理程序来处理。这样的处理程序将基于User-Agent(中继到服务器的唯一信息)检查Retina支持。然后,根据服务器端逻辑决定是否要提供高DPI图片来加载适当的资产(根据一些已知的惯例命名)。

优点:兼容低版本浏览器

缺点:用户代理不一定提供足够的信息来决定设备是否应该接收高质量或低质量的图像。此外

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中可以使用 ImageIO 类的 write 方法来写入 PNG 和 JPEG 图片,并且可以设置 DPI。 对于 PNG 图片,可以使用 ImageWriteParam 对象来设置 DPI。代码示例如下: ```java BufferedImage image = ImageIO.read(new File("input.png")); ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next(); ImageWriteParam writeParam = writer.getDefaultWriteParam(); IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(image), writeParam); String metadataFormatName = metadata.getNativeMetadataFormatName(); IIOMetadataNode pngNode = new IIOMetadataNode(metadataFormatName); IIOMetadataNode pHYsNode = new IIOMetadataNode("pHYs"); int dpi = 300; // 设置 DPI pHYsNode.setAttribute("pixelsPerUnitXAxis", Integer.toString((int) Math.round(dpi / 0.0254))); pHYsNode.setAttribute("pixelsPerUnitYAxis", Integer.toString((int) Math.round(dpi / 0.0254))); pHYsNode.setAttribute("unitSpecifier", "meter"); pngNode.appendChild(pHYsNode); metadata.mergeTree(metadataFormatName, pngNode); File output = new File("output.png"); ImageOutputStream stream = ImageIO.createImageOutputStream(output); writer.setOutput(stream); writer.write(metadata, new IIOImage(image, null, metadata), writeParam); stream.close(); writer.dispose(); ``` 对于 JPEG 图片,可以使用 JPEGImageWriteParam 对象来设置 DPI。代码示例如下: ```java BufferedImage image = ImageIO.read(new File("input.jpg")); ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); ImageWriteParam writeParam = writer.getDefaultWriteParam(); JPEGImageWriteParam jpegWriteParam = new JPEGImageWriteParam(Locale.getDefault()); int dpi = 300; // 设置 DPI jpegWriteParam.setDensityUnit(JPEGImageWriteParam.DENSITY_UNIT_DOTS_INCH); jpegWriteParam.setXDensity(dpi); jpegWriteParam.setYDensity(dpi); jpegWriteParam.setQuality(1.0f, false); writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); writeParam.setCompressionQuality(1.0f); File output = new File("output.jpg"); ImageOutputStream stream = ImageIO.createImageOutputStream(output); writer.setOutput(stream); writer.write(null, new IIOImage(image, null, null), jpegWriteParam); stream.close(); writer.dispose(); ``` 需要注意的是,设置 DPI 只是给图片添加了元数据,实际上并没有改变图片的像素大小和分辨率。要改变图片的像素大小和分辨率,需要对图片进行缩放操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值