建议转发---解决win10图片自动保存为jfif,导致无法使用的问题.

本文介绍了Windows 10更新后照片自动保存为不常见的jfif格式,导致多数软件无法识别的问题。作者指出这是微软推动用户升级到最新系统的策略,并提供了通过修改注册表将jfif格式改为jpg的解决方法。
摘要由CSDN通过智能技术生成

你好,我是江潮.

昨天写文章的时候.突然发现多出了一种文件格式:jfif.本着好奇的精神我还特意查了一下.

JFIF:

图片存储格式之一,由JPEG格式衍生而来,后缀为".jfif"。
JPEG本身只有描述如何将一个图像转换为字节的数据串流(streaming),但并没有说明这些字节如何在任何特定的储存媒体上被封存起来。一个由独立JPEG小组(Independent JPEG Group)所建立的额外标准,称为JFIF(JPEG File Interchange Format,JPEG档案交换格式).

看上去是挺不错的,但是用了之后我才发现,这个格式不太行啊.


基本上什么都不支持使用,就连ps都无法识别.

但是,既然是新出来的.不应该这么废物啊.于是我有查了一下.原来啊
这个是微软新出的,只要是win10更新了.所以照片都直接默认成jfif格式.

是不是很熟悉?没错这和微软为了推荐win10一样.

Microsoft 承诺为 Windows 7 提供自其 2009 年 10 月 22

如果在设置DPI时,`app0Jfif`为null,可以尝试使用`javax_imageio_1.0`元数据标记来设置DPI。下面是修改后的代码: ```java import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataNode; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class ImageDPIExample { public static void main(String[] args) { // 加载图像 BufferedImage image = null; try { image = ImageIO.read(new File("input.jpg")); } catch (IOException e) { e.printStackTrace(); } // 创建一个新的图像,设置分辨率 BufferedImage newImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g2d = newImage.createGraphics(); g2d.drawImage(image, 0, 0, null); g2d.dispose(); // 设置DPI String outputImagePath = "output.jpg"; File outputFile = new File(outputImagePath); try { ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); ImageWriteParam writeParam = writer.getDefaultWriteParam(); if (writeParam.canWriteCompressed()) { writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); writeParam.setCompressionQuality(1f); } // 设置DPI IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(newImage), writeParam); String metadataFormat = metadata.getNativeMetadataFormatName(); IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree(metadataFormat); IIOMetadataNode jpegVariety = getChildNode(root, "JPEGvariety"); IIOMetadataNode markerSequence = getChildNode(jpegVariety, "markerSequence"); IIOMetadataNode app0JFIF = getChildNode(markerSequence, "app0JFIF"); if (app0JFIF == null) { app0JFIF = new IIOMetadataNode("app0JFIF"); app0JFIF.setAttribute("majorVersion", "1"); app0JFIF.setAttribute("minorVersion", "2"); app0JFIF.setAttribute("resUnits", "1"); app0JFIF.setAttribute("Xdensity", "300"); app0JFIF.setAttribute("Ydensity", "300"); markerSequence.appendChild(app0JFIF); } else { app0JFIF.setAttribute("resUnits", "1"); app0JFIF.setAttribute("Xdensity", "300"); app0JFIF.setAttribute("Ydensity", "300"); } metadata.mergeTree(metadataFormat, root); // 保存图像 writer.setOutput(ImageIO.createImageOutputStream(outputFile)); writer.write(metadata, new IIOImage(newImage, null, metadata), writeParam); writer.dispose(); } catch (IOException e) { e.printStackTrace(); } } private static IIOMetadataNode getChildNode(IIOMetadataNode parentNode, String nodeName) { for (int i = 0; i < parentNode.getLength(); i++) { if (parentNode.item(i).getNodeName().equalsIgnoreCase(nodeName)) { return (IIOMetadataNode) parentNode.item(i); } } return null; } } ``` 上述代码中,我们使用`getChildNode()`方法来获取元数据节点,如果`app0JFIF`节点不存在,则创建一个新的节点,并设置相关属性。如果`app0JFIF`节点已存在,则直接设置属性值。 这样修改后的代码应该可以在没有`app0JFIF`节点的情况下设置DPI。请注意,上述示例代码仅适用于保存JPEG图像,并且设置的DPI为300。你可以根据需要进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值