为什么图像要旋转并调整大小而不是仅调整大小?

2024-03-12

我想调整图像大小而不旋转图像 这是我的代码。

Image temp = image.getScaledInstance(width, height,ImageScale.SCALE_SMOOTH);
BufferedImage resized = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = resized.createGraphics();
g2d.drawImage(temp, 0, 0, width, height, null);
g2d.dispose();
return resized;

当您调整图像大小时,写入的新图像不包含 EXIF 数据,因此它显示为原始图像,这使得它看起来像是在侧面。

我有一个示例代码向您展示如何保留 EXIF 数据:

public class ImageData {

public byte[] resize(int maxDimension, File imageFile) throws IOException {
    DataInputStream inStream = null;
    try {
        inStream = new DataInputStream(
                new BufferedInputStream(
                        new FileInputStream(imageFile)));

        byte[] imageData = IOUtils.toByteArray(inStream);

        BufferedImage image = readImage(imageData);

        TiffImageMetadata metadata = readExifMetadata(imageData);

        image = Scalr.resize(image, maxDimension);

        if (metadata != null) {
            imageData = writeExifMetadata(metadata, writeJPEG(image));

        } else {
            imageData = writePNG(image);
        }

        return imageData;

    } catch (IOException | ImageReadException | ImageWriteException e) {
        log.error("image resize failed", e);
        return null;
    } finally {
        assert inStream != null;
        inStream.close();
    }
}

private TiffImageMetadata readExifMetadata(byte[] jpegData) throws ImageReadException, IOException {
    ImageMetadata imageMetadata = Imaging.getMetadata(jpegData);
    if (imageMetadata == null) {
        return null;
    }
    JpegImageMetadata jpegMetadata = (JpegImageMetadata)imageMetadata;
    return jpegMetadata.getExif();
}

private byte[] writeExifMetadata(TiffImageMetadata metadata, byte[] jpegData)
        throws ImageReadException, ImageWriteException, IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    new ExifRewriter().updateExifMetadataLossless(jpegData, out, metadata.getOutputSet());
    out.close();
    return out.toByteArray();
}

private BufferedImage readImage(byte[] data) throws IOException {
    return ImageIO.read(new ByteArrayInputStream(data));
}

private byte[] writeJPEG(BufferedImage image) throws IOException {
    ByteArrayOutputStream jpegOut = new ByteArrayOutputStream();
    ImageIO.write(image, "JPEG", jpegOut);
    jpegOut.close();
    return jpegOut.toByteArray();
}

/**
 *
 * @param image
 * @return byte[]
 * @throws IOException
 * This method calls when the metadata of a JPEG image is null,
 * it will convert the JPEG image to PNG
 */
private byte[] writePNG(BufferedImage image) throws IOException {
    ByteArrayOutputStream pngOut = new ByteArrayOutputStream();
    ImageIO.write(image,"PNG",  pngOut);
    pngOut.close();
    return pngOut.toByteArray();
}

}

你可以像这样使用这个类:

 public String convertImageToThumbnail(String path) {
    try {
        File imageFile = new File(path);
        byte[] imageBytes;
        String ex = path.substring(path.lastIndexOf(".")+1);

       ImageData imageData = new ImageData();
       imageBytes = imageData.resize(50, imageFile);
        
        String output = Base64.getEncoder().encodeToString(imageBytes);
        return "data:image/"+ex+";base64," + output;
    } catch (Exception e) {
        log.error("Converting to thumbnail failed", e);
        return null;
    }
}

您可以使用此示例调整大小并保留 EXIF 数据。 希望它会有用...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么图像要旋转并调整大小而不是仅调整大小? 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐