Java:检测图像格式、调整大小(缩放)并另存为 JPEG

2024-04-01

这是我的代码,它实际上有效,虽然不完美,但确实有效,问题是调整大小的缩略图没有粘贴在白色绘制的矩形上,破坏了图像的长宽比,这是代码,有人可以建议我修复吗为了它,好吗?

谢谢

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ImageScalerImageIoImpl implements ImageScaler {

 private static final String OUTPUT_FORMAT_ID = "jpeg";

 // Re-scaling image
 public byte[] scaleImage(byte[] originalImage, int targetWidth,
   int targetHeight) {

  try {
   InputStream imageStream = new BufferedInputStream(
     new ByteArrayInputStream(originalImage));
   Image image = (Image) ImageIO.read(imageStream);

   int thumbWidth = targetWidth;
   int thumbHeight = targetHeight;

   // Make sure the aspect ratio is maintained, so the image is not skewed
         double thumbRatio = (double)thumbWidth / (double)thumbHeight;
         int imageWidth = image.getWidth(null);
         int imageHeight = image.getHeight(null);
         double imageRatio = (double)imageWidth / (double)imageHeight;
         if (thumbRatio < imageRatio) {
           thumbHeight = (int)(thumbWidth / imageRatio);
         } else {
           thumbWidth = (int)(thumbHeight * imageRatio);
         }

   // Draw the scaled image
   BufferedImage thumbImage = new BufferedImage(thumbWidth,
     thumbHeight, BufferedImage.TYPE_INT_RGB);
   System.out.println("Thumb width Buffered: " + thumbWidth + " || Thumb height Buffered: " + thumbHeight);

   Graphics2D graphics2D = thumbImage.createGraphics();
   // Use of BILNEAR filtering to enable smooth scaling
   graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
     RenderingHints.VALUE_INTERPOLATION_BILINEAR);
   // graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);

   // White Background
   graphics2D.setPaint(Color.WHITE);
   graphics2D.fill(new Rectangle2D.Double(0, 0, targetWidth,
     targetHeight));
   graphics2D.fillRect(0, 0, targetWidth, targetHeight);

   System.out.println("Target width: " + targetWidth + " || Target height: " + targetHeight);

   // insert the resized thumbnail between X and Y of the image 
   graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);

   System.out.println("Thumb width: " + thumbWidth + " || Thumb height: " + thumbHeight);

   // Write the scaled image to the outputstream
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   ImageIO.write(thumbImage, OUTPUT_FORMAT_ID, out);
   return out.toByteArray();

  } catch (IOException ioe) {
   throw new ImageResizingException(ioe);
  }
 }

}

您可以使用以下方法轻松缩放图像Image http://java.sun.com/javase/6/docs/api/java/awt/Image.html's getScaledInstance http://java.sun.com/javase/6/docs/api/java/awt/Image.html#getScaledInstance(int,%20int,%20int) method:

BufferedImage img = ImageIO.read(new File("image.jpg"));
int scaleX = (int) (img.getWidth() * 0.5);
int scaleY = (int) (img.getHeight() * 0.5);

Image newImg = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH);

一旦你获得了你的比例Image你可以将它“转换”回BufferedImage http://java.sun.com/javase/6/docs/api/java/awt/image/BufferedImage.html如上所述here http://www.exampledepot.com/egs/java.awt.image/Image2Buf.html.

最后,使用ImageIO http://java.sun.com/javase/6/docs/api/javax/imageio/ImageIO.html类来写你的BufferedImage到一个文件。

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

Java:检测图像格式、调整大小(缩放)并另存为 JPEG 的相关文章

随机推荐

  • 如何以编程方式运行 NUnit

    我有一些引用 NUnit 的程序集并使用单个测试方法创建单个测试类 我能够获取该程序集的文件系统路径 例如 C test dll 我想以编程方式使用 NUnit 来针对该程序集运行 到目前为止我有 var runner new Simple
  • 我无法打开可变文件名

    有什么理由吗Dev C 不让我做file open file name variable 我不明白为什么它不允许我打开任何东西 除了像这样的硬编码名称file open abc txt 如何解决这个问题 不使用 Dev C 这基本上是我所拥
  • DecimalFormat 的奇数结果四舍五入

    提供一个浮点值37 35我得到一串37 3 这是我的代码 DecimalFormat format new DecimalFormat 0 format setRoundingMode RoundingMode HALF UP return
  • C# 剪贴板直接复制粘贴

    Hi 我想直接复制 粘贴 例如我只需单击一下按钮即可将粘贴到剪贴板 为此您可以编写示例代码 如果您想从文本框 在此示例中为 textBox1 复制 则需要以下内容 Clipboard SetText textBox1 Text To cop
  • 无法移出 ViewPort 窗格 - Selenium

    我正在尝试使网页自动化 http the internet herokuapp com exit intent http the internet herokuapp com exit intent 如果我们从视图窗格移向页面顶部 则会出现
  • 防止一个元素覆盖另一个元素[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个固定的标题 当我滚动时 某些
  • 如何在.net中检索硬盘固件序列号?

    如何在 net 中检索硬盘固件序列号 我能够使用 WMI 调用检索 HDD 序列号 但无法找到任何方法来检索 HDD 固件序列号 提前感谢 使用 WMI 简单来说 这是一个低级函数 没有 理智的 更高级别的 API 会支持 读取或写入文件是
  • 什么是 F# 引号?

    F 中的 引号 是什么 它们的用途是什么 See http msdn microsoft com en us library dd233212 aspx http msdn microsoft com en us library dd233
  • Rails 5.2.0 与 Ruby 2.5.1 控制台 - `警告:``已经`初始化常量 FileUtils::VERSION

    我目前在新的 Rails 应用程序中遇到问题 更具体地说 轨道 5 2 0 Ruby 2 5 1p57 2018 03 29 修订版 63029 x86 64 darwin17 rvm 1 29 4 最新 作者 Michal Papis P
  • 将日期字符串解析为 java.util.Date 时出现非法模式字符“T”

    我有一个日期字符串 我想使用 java Date API 将其解析为正常日期 以下是我的代码 public static void main String args String date 2010 10 02T12 23 23Z Stri
  • 在 Mongoose 中间件方法之间共享数据 pre save 和 post save

    请参阅底部更新的示例代码 我在当前的 NodeJS 项目中使用 Mongoose 顺便说一句 这非常棒 并且我有一个 MDB 集合 它将在不同的集合中存储文档的更改 基本上是一个变更日志存储修改的内容 我试图实现的方法是创建一个存储文档的
  • 如何在C++中使用类对象作为函数参数

    我不确定如何拥有一个接收类对象作为参数的函数 有什么帮助吗 下面是一个例子 include
  • 在 MongoDB 中使用排序、限制,然后再次排序

    我正在使用 MongoDB 创建一个聊天应用程序 基本上我需要检索最新的 20 条聊天消息 然后按日期升序显示它们 为了获取最后 20 条聊天消息 我的代码如下所示 db messages find sort date 1 limit 20
  • 在 Linux 上以编程方式为 gdb 在 C 或 C++ 代码中设置断点

    如何以编程方式在 C 或 C 代码中设置适用于 Linux 上的 gdb 的断点 I e int main int argc char argv set breakpoint here int a 3 a In gdb gt print a
  • Mac 上 OpenGL 中的多线程视频渲染显示严重的闪烁问题

    我有一个视频播放器应用程序 并使用多个线程以保持用户交互仍然流畅 解码视频的线程最初只是将生成的帧作为 BGRA 写入 RAM 缓冲区 该缓冲区由 glTexSubImage2D 上传到 VRAM 对于普通视频来说效果足够好 但正如预期的那
  • 将 gtest 与 xcode 结合使用

    我正在尝试在我的计算机上设置一个 C 单元测试库 并认为 google 的 gtest 会很合适 我目前正在使用最新版本的 xcode 运行 mountain lion 我一直在尝试按照发现的说明进行操作here http code goo
  • iOS 13 SwiftUI:应用程序在真实设备上启动时崩溃

    在 SwiftUI 和 Apple 的新测试版 macOS 10 15 iOS 13 和 Xcode 11 发布后 我开始开发基于新技术的应用程序 考虑到所有涉及的软件和系统都处于测试阶段 开发进展顺利 然而 当尝试在真实设备 iPhone
  • 使用 System.Text.Json 反序列化匿名类型

    我正在更新 NET Core 3 x 的一些应用程序 作为其中的一部分 我正在尝试从Json NET到新的System Text Json类 使用 Json NET 我可以反序列化匿名类型 如下所示 var token JsonConver
  • 优化三角矩阵计算的 CUDA 内核的执行

    我正在开发我的第一个 Cuda 应用程序 并且我的内核 吞吐量低于预期 这似乎是目前最大的瓶颈 内核的任务是计算一个 N N 大小的矩阵 DD 包含数据矩阵上所有元素之间的平方距离 数据矩阵 Y 的大小为 N D 以支持多维数据 并存储为行
  • Java:检测图像格式、调整大小(缩放)并另存为 JPEG

    这是我的代码 它实际上有效 虽然不完美 但确实有效 问题是调整大小的缩略图没有粘贴在白色绘制的矩形上 破坏了图像的长宽比 这是代码 有人可以建议我修复吗为了它 好吗 谢谢 import java awt Color import java