AffineTransform 截断图像

2023-12-10

我有一个图像,我必须将其旋转 45、90、135、180 度。我在做什么:

try {
    BufferedImage src = ImageIO.read(new File("src.png"));
    double ang = Math.toRadians(90);

    AffineTransform t = new AffineTransform();
    t.setToRotation(ang, src.getWidth() / 2, src.getHeight() / 2);

    AffineTransformOp op = new AffineTransformOp(t, null);
    BufferedImage dst = new BufferedImage(src.getWidth(), src.getHeight(), src.getType());
    op.filter(src, dst);

    ImageIO.write(dst, "png", new File("output.png"));
} catch(Exception ex) { ex.printStackTrace();
}

问题是图像改变了位置并超出了目标图像的范围:

The problem

我用谷歌搜索了这个并找到了这个问题的解决方案:AffineTransform 截断图像,我错了什么?但我完全不明白它,它只适用于象限。我尝试将目标的宽度和高度乘以两倍,但失败了:

Another fail

如何解决这个问题?目标图像不应有任何额外的(对角线旋转所需的除外)空白或截断区域。角度问题(0 == 180 还是顺时针)并不重要。

谢谢你的帮助。


编辑:现在它适用于一般情况。

旋转是围绕中心执行的,并且中心放置在目标图像中与源图像中相同的位置(正确行为)。

我已经修改了您的代码以转换源图像矩形,以便我们可以轻松获得新的尺寸/图像偏移量。这用于构建目的地BufferedImage正确的尺寸,并将翻译附加到您的AffineTransform因此图像中心放置在目标图像的中心。

        BufferedImage src = ImageIO.read(new File(INPUT));
        int w = src.getWidth();
        int h = src.getHeight();

        AffineTransform t = new AffineTransform();
        double ang = Math.toRadians(35);
        t.setToRotation(ang, w / 2d, h / 2d);

        // source image rectangle
        Point[] points = {
            new Point(0, 0),
            new Point(w, 0),
            new Point(w, h),
            new Point(0, h)
        };

        // transform to destination rectangle
        t.transform(points, 0, points, 0, 4);

        // get destination rectangle bounding box
        Point min = new Point(points[0]);
        Point max = new Point(points[0]);
        for (int i = 1, n = points.length; i < n; i ++) {
            Point p = points[i];
            double pX = p.getX(), pY = p.getY();

            // update min/max x
            if (pX < min.getX()) min.setLocation(pX, min.getY());
            if (pX > max.getX()) max.setLocation(pX, max.getY());

            // update min/max y
            if (pY < min.getY()) min.setLocation(min.getX(), pY);
            if (pY > max.getY()) max.setLocation(max.getX(), pY);
        }

        // determine new width, height
        w = (int) (max.getX() - min.getX());
        h = (int) (max.getY() - min.getY());

        // determine required translation
        double tx = min.getX();
        double ty = min.getY();

        // append required translation
        AffineTransform translation = new AffineTransform();
        translation.translate(-tx, -ty);
        t.preConcatenate(translation);

        AffineTransformOp op = new AffineTransformOp(t, null);
        BufferedImage dst = new BufferedImage(w, h, src.getType());
        op.filter(src, dst);

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

AffineTransform 截断图像 的相关文章

随机推荐

  • 使用 docker-compose 自动创建数据库和表

    我正在使用 docker compose 上传环境 但我想在 docker compose 中自动创建一个表 但是它不起作用 docker 撰写 mysql image mysql 5 7 stdin open true tty true
  • 处理 INI 文件中重复的节名称

    我需要从 INI 文件加载这些值并使用 C Boost 库在应用程序中打印它们 这些部分具有重复的名称 我被限制只能使用 C Boost 库 numColors 4 boardSize 11 numSnails 2 initializati
  • 如何在Python中确定一周的第一天

    根据区域设置 我需要找到一周的第一天 周日 周一 在JAVA中我会这样做 Calendar FR cal Calendar getInstance Locale FRANCE Calendar CA cal Calendar getInst
  • 如何在docker容器中优雅地关闭tomcat中的servlts?

    到目前为止我发现了什么 docker stop 向容器中的进程 ID 1 发送 SIGTERM 容器中的进程ID 1是运行tomcat的java进程 是的 tomcat 本身会正常关闭 但 servlet 不会这样做 Servlet 会在
  • 在javascript中如何动态获取对象的嵌套属性

    var arr foo 1 bar baz 2 bee 3 function getter variable return arr variable 如果我想要 foo 与 bee 我可以这样做arr variable 这很简单 函数就可以
  • Apache CXF 初始化上的调用方法

    我正处于 如何做 阶段Apache CXF并想知道是否有办法在服务器启动时调用方法 它类似于JSF网络应用程序 当我使用 ApplicationScoped托管 Bean 与eager true 当容器启动时 带注释的类被实例化 我可以从它
  • 改变WinForm边框的样式?

    是否可以更改 WinForm 边框的样式 我知道 如果删除边框 就会失去调整程序大小的功能 因此 有没有办法改变它的样式 但保持它的大小可调 你所寻求的并不简单 因为边界是由操作系统划定的 然而 CodePlex 上有一个库确实可以做到这一
  • OpenMP 卸载了在主机和目标设备中执行的目标区域

    我正在开发一个项目 需要使用 Clang 将 OpenMP 卸载到 Nvidia GPU 我能够按照提到的说明安装 Clang 以支持卸载here 系统规格 操作系统 Ubuntu 16 04 LTS 铿锵 版本 4 00 处理器 Inte
  • 在 Oracle PL/SQL 中从 xml 中提取值

  • 使用 \copy 时的 Postgres 变量替换

    我正在使用 psql 命令 copy 并且我想从 shell 向它传递一个变量 用于表名 就像我在编写查询脚本时所做的那样 我在文档中读到 该命令的语法与 SQL COPY 命令类似 请注意 因此 特殊的解析规则适用于 copy 命令 特别
  • 使用 web.config 文件在 IIS 中看似简单的重定向

    我重组了一个托管在 Windows 服务器上的 WordPress 网站 因此我尝试使用 web config 文件进行重定向 我已经尝试了几十种示例的变体 但无法使其工作 新的 url 已更改为 www mysite com wp wha
  • 在 Folium 中突出显示一个特定国家

    我有一张由folium绘制的地图 如下 m folium Map location 51 1657 10 4515 zoom start 6 min zoom 5 max zoom 7 如何摆脱邻国而只保留德国 或者邻国变得褪色 模糊 苍白
  • 如何从 LotusScript 代理调用 SOAP 1.2 Web 服务?

    我在 Windows 服务器上使用 Lotus Domino 9 我必须打电话给Soap 1 2不再维护的网络服务 莲花Web 服务消费者只接受Soap 1 1web 服务 所以我不能使用这个很好的功能来绑定我的 web 服务 是否可以致电
  • 在 C 中转换向量的 C++ 实现

    我用 C 编写了以下代码 但是发现我必须将其转换为 C 我不是 C 甚至 C 程序员 请帮忙 有人可以帮我将此方法更改为 C 指令 特别是向量实现 以下将无法编译我已经删除了复杂性以保持简单 感谢期待 declspec dllexport
  • 编码的共享 URI 中的站点无效

    我尝试使用 Microsoft Graph 从共享链接中提取一些文件 但是 当我尝试使用 Microsoft Graph Explorer 执行此操作时 它返回 error code invalidRequest message The s
  • 我无法全局安装nodemon,“nodemon”无法识别

    我想使用 nodemon 来监视我的 node js 应用程序 然后执行下一行命令 npm install g nodemon or npm install nodemon g 当我移动到我的应用程序文件夹并尝试 nodemon app j
  • 引用计数降至零后多久调用 __del__ ?

    引用计数达到零后多久 del 方法调用 该语言是否承诺在任何其他使用代码执行之前它会立即完成 或者每个实现都可以做它喜欢的事情 可能会延迟对 del 任意长 请忽略程序即将退出时的情况 我认为这意味着给定块中的最后一条语句已完成 并且堆栈为
  • 以高于屏幕分辨率的 dpi 打印表单

    Problem 我们需要有关如何使用 WinForms 自动缩放到不同 DPI 的功能的帮助 以便我们能够以 600 dpi 而不是屏幕 DPI 打印表单 对于 所见即所得 打印 我们只是简单地使用布局精美的窗口并打印它 关闭滚动条和按钮等
  • pandas drop_duplicates 不可散列类型:'numpy.ndarray'、'set' 和 'list'

    我正在尝试使用drop duplicates在a的一列上dataframe A len 1 2 2 1 2 2 3 1 4 5 2 4 5 2 结果dataframe应该看起来像 A len 1 2 2 3 1 4 5 2 我努力了df d
  • AffineTransform 截断图像

    我有一个图像 我必须将其旋转 45 90 135 180 度 我在做什么 try BufferedImage src ImageIO read new File src png double ang Math toRadians 90 Af