Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中将.jpeg图像转换为.jif?(进出口银行到JFIF)_Java_Type Conversion_Jpeg - Fatal编程技术网

如何在java中将.jpeg图像转换为.jif?(进出口银行到JFIF)

如何在java中将.jpeg图像转换为.jif?(进出口银行到JFIF),java,type-conversion,jpeg,Java,Type Conversion,Jpeg,客户要求我以.JIF格式(JFIF)发送图像。我有java应用程序,但我不能用谷歌anithing来讨论如何转换成那种图像类型,我甚至很难用谷歌anithing来转换成“.JIF”格式 编辑: 有人能建议如何在java中将Exif映像转换为JFIF吗?如何向这个JFIF图像添加元素? (尝试使用jheader library很遗憾以nullpointer异常而告终,在google上没有更多的选择。)首先,你需要读取该图像,然后你必须将该图像写入你想要的维度和格式。 必须使用ImageIO类和Bu

客户要求我以.JIF格式(JFIF)发送图像。我有java应用程序,但我不能用谷歌anithing来讨论如何转换成那种图像类型,我甚至很难用谷歌anithing来转换成“.JIF”格式

编辑: 有人能建议如何在java中将Exif映像转换为JFIF吗?如何向这个JFIF图像添加元素?
(尝试使用jheader library很遗憾以nullpointer异常而告终,在google上没有更多的选择。)

首先,你需要读取该图像,然后你必须将该图像写入你想要的维度和格式。 必须使用ImageIO类和BufferedReader读取图像 要编写它们,请使用图形2D类 将格式名称替换为jif

 File inputFile = new File(inputImagePath);
    BufferedImage inputImage = ImageIO.read(inputFile);

    // creates output image
    BufferedImage outputImage = new BufferedImage(scaledWidth,
            scaledHeight, inputImage.getType());

    // scales the input image to the output image
    Graphics2D g2d = outputImage.createGraphics();
    g2d.drawImage(inputImage, 0, 0, scaledWidth, scaledHeight, null);
    g2d.dispose();

    // extracts extension of output file
    String formatName = outputImagePath.substring(outputImagePath
            .lastIndexOf(".") + 1);

    // writes to output file
    ImageIO.write(outputImage, formatName, new File(outputImagePath));

编辑:将Exif JPEG转换为JFIF JPEG:

如果您不介意丢失一些质量(由于有损JPEG重新编码),您可以简单地转换图像,如下所示:

File inFile = ...;
File outFile = ...; // Feel free to use ".jif" as extension

if (!ImageIO.write(ImageIO.read(inFile), "JPEG", outFile)) {
    System.err.println("Could not write JPEG format"); // Should never happen
}
这将起作用,因为默认的
JPEGImageWriter
插件只支持JFIF格式。由于我们不读取元数据,旧的Exif信息将丢失。但是,这样做将不允许您添加注释

要添加注释,您仍然可以使用标准的ImageIO API,但我们必须访问元数据,使代码更加冗长。有关元数据格式的详细信息,请参见。如果您需要转换Exif元数据中的注释,请将您的问题更新为具体问题,因为它需要进一步解析元数据,并提供ImageIO API中目前没有的额外支持

File inFile = ...;
File outFile = ...; // Feel free to use ".jif" as extension

    BufferedImage image = ImageIO.read(inFile);

    ImageWriter jpegWriter = ImageIO.getImageWritersByFormatName("JPEG").next(); // Should be a least one

    // To write comments, we need to add it to the metadata
    ImageWriteParam param = jpegWriter.getDefaultWriteParam();
    IIOMetadata metadata = jpegWriter.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(image), param);
    IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree("javax_imageio_jpeg_image_1.0");
    IIOMetadataNode markerSequence = (IIOMetadataNode) root.getElementsByTagName("markerSequence").item(0); // Should be only one

    // Insert a "COM" marker, with our comment
    IIOMetadataNode com = new IIOMetadataNode("com");
    com.setAttribute("comment", "Hello JFIF!");
    markerSequence.appendChild(com);

    // Merge edited metadata 
    metadata.mergeTree("javax_imageio_jpeg_image_1.0", root);

    ImageOutputStream output = ImageIO.createImageOutputStream(outFile);
    try {
        jpegWriter.setOutput(output);

        // Write image along with metadata
        jpegWriter.write(new IIOImage(image, null, metadata));
    }
    finally {
        output.close();
    }

    jpegWriter.dispose();
这样,我们仍然用有损JPEG对图像进行重新编码,但我们将Exif转换为JFIF并添加注释

现在,还有另一种选择,完全无损地完成这项工作。但它确实需要对JIF段结构以及Exif和JFIF格式如何工作有一点更深入的了解。不幸的是,没有标准的JavaAPI(据我所知)来实现这一点,所以您必须自己开发。请随意使用我的作为起点。你链接的项目看起来也很有希望,但是我没有任何关于这个库的经验,所以我不能在那里提供任何建议

基本思路如下:

  • 分析/跳过标记段,直到SOS(扫描开始)段(SOS之后的数据将是压缩图像数据)
  • 写入SOI标记(
    0xffd8
  • 创建一个APP0/“JFIF”标记(我认为您可以在这里使用默认值,有关详细信息,请参阅)。可以为拇指尺寸写入0、0,并跳过写入缩略图数据
  • 添加带有所需注释的COM段(可能从Exif元数据中提取)
  • 按照原始流的原样编写SOF、DHT、DQT等标准段(跳过APP1/“Exif”和其他“自定义”段)
  • 写入SOS标记和原始流中的图像数据
  • 理论上,这应该是可行的。您可能会遇到一些较小的颜色空间问题,因为Exif数据可能包含不同的颜色空间(通常为sRGB或AdobeRGB1998),而。如果需要,请添加一个APP2/“ICC_PROFILE”段和所需的配置文件(在步骤3之后)

    祝你好运!:-)


    注意:这不是一个完整的答案,而是试图澄清为什么你需要和你的客户交谈,并找出你的JPEG有什么问题,以及他所说的“JIF”是什么意思

    首先,JPEG不是一种文件格式。是一种静态图像压缩标准。本标准的一部分(通常称为“附录B”)是对交换格式的描述,有时称为JIF。该标准还指定了一种称为SPIFF的完整文件格式,但这种格式并不广泛(我认为这不是您想要的)

    随处可见的文件,称为“JPEG文件”(我假设这就是您所说的“经典JPEG”),通常是两种基本相同的文件格式中稍有不同的一种:

    最基本的格式是JFIF。此格式以SOI标记开始,紧接着是一个APP0标记,其标识符为“JFIF”(以null结尾)。根据“JPEG文件交换格式与标准JPEG交换格式完全兼容;唯一的附加要求是必须在SOI标记后立即出现APP0标记。”(本规范的ISO和ISO版本中没有此部分,但仍然适用)。简言之,JFIF将JPEG数据限制为1或3个分量,编码为Y或YCbCr,并强烈推荐基线DCT、哈夫曼编码压缩

    另一种常见的格式是。此格式以SOI标记开始,紧接着是一个APP1标记,其标识符为“Exif”(以null结尾)。这种格式由数码相机制造商开发,允许在文件中记录更丰富的元数据(以TIFF元数据结构的形式)。据我所知,Exif将JPEG数据限制为3个组件,编码为YCbCr,使用基线DCT、哈夫曼编码压缩(最后一部分可能只是互操作性建议,规范中的语言有点难读…)

    这两种格式都包含相同的“段”布局,并且图像数据是兼容的,但它们仍然是互斥的,因为需要将“它们的”标记作为流中的第一段(因此也是“第三段”)格式存在,这是一个JFIF兼容性,但仍然包含一个Exif段(更丰富的元数据)

    另一个“JPEG文件”系列缺少JFIF和Exif标记,但仍然遵循相同的段布局,具有SOI、APPn标记、SOF、DHT、DQT、SOS和EOI标记,如“附录B”(JIF)所述。大多数解码器也会对这些图像进行解码

    TL;简言之,所有“JPEG”文件格式的共同点是