跳到内容
  • 福昕首页
  • 开发中心
  • SDK文档资料
  • 插件商店
  • 福昕首页
  • 开发中心
  • SDK文档资料
  • 插件商店
申请试用
  • 企业自动化
    • Compressor
  • 福昕CloudAPI
  • 福昕PDF SDK 软件开发工具包
    • 福昕PDF SDK(ActiveX)
    • 福昕PDF SDK(桌面/服务器)
    • 福昕PDF SDK(Plug-in)
    • 福昕 PDF SDK(安卓)
    • 福昕PDF SDK(iOS)
    • 福昕PDF SDK(Web)
  • 福昕管理控制台
    • 公有云
    • 私有云
    • 通用情况
  • 福昕阅读器
    • RMS插件
  • 福昕高级编辑器
    • AI助手
    • Mac版本
      • 常规问题
    • Windows版本
      • ECM集成
      • 互联PDF
      • 企业管理指南
      • 保护
      • 内容编辑
      • 创建PDF
      • 压缩
      • 图章
      • 安装与卸载
      • 常见问题
      • 打印
      • 注释/评论
      • 福昕插件
      • 翻译助手
      • 翻译助手教程
      • 试用与激活
      • 转换
      • 页面管理
    • 教育用户
      • 论文查重
      • 论文畅
      • 操作指南
    • 网页版
      • Foxit eSign
      • 电子签章
    • 订阅
    • 资源
  • 福昕高级编辑器Linux版本
  • 福船图纸管理系统
  • 福昕PDF SDK 软件开发工具包 > 福昕PDF SDK(桌面/服务器)
  • 标签:
  • matrix,图片对象,旋转,旋转角度,矩阵,缩放,翻转

怎么判断图片对象的旋转角度和翻转情况?

  • 福昕知识库
  • 2025-01-26

使用场景:再导出PDF中的图片时,通常会用到ImageObject.CloneBitmap()的接口。如果出现导出的图片发生了旋转,翻转等情况,可能是因为该图片对象imageObject的变换矩阵Matrix中有旋转、翻转上的处理,导致PDF显示效果,和实际导出的图片不太一致。

变换矩阵matrix介绍:

Matrix2D={a,b,c,d,e,f}是一个包含6个元素的数组,用来控制对象的缩放、平移、旋转、扭曲。 在PDF中,图形、图片、文本、渐变等几何对象,如果要做几何变换都会用到matrix。

以下是PDF标准中对如何计算matrix的描述:

数组[a,b,c,d,e,f]以矩阵的方式呈现,并用于计算的旋转和拉伸的计算方式1.变换计算的过程(将默认的matrix,进行旋转、缩放、翻转):

缩放变换:Sx和Sy分别表示横纵缩放比例,如果是负的,则会翻转(Sx<0水平翻转,Sy<0垂直翻转)。

旋转变换:Rc=Cosθ ,Rs=Sinθ θ表示逆时针旋转角度

注意:先旋转后翻转 和先翻转后旋转的结果是不同的,顺序不可以变。

计算旋转和翻转情况的代码(C#)示例如下:

using System;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
using ErrorCode = foxit.common.ErrorCode;
using foxit.pdf.graphics;
using Bitmap = foxit.common.Bitmap;

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Web;
using Image = foxit.common.Image;
using System.IO;

namespace pdf2imageCS
{


  
    class pdf2image
    {

        public static void Page2Bitmap(PDFPage page,int dpi_x, int dpi_y,String savePath)
        {
            {
                page.StartParse(0, null, true);
                //规范化页面,取消页面旋转和pageBox带来的影响
                page.Normalize();
                page.StartParse(0, null, true);
                RectF rectf=new RectF(0,0, page.GetWidth(), page.GetHeight());
                float pro_x =(float) dpi_x / 72;
                float pro_y = (float)dpi_y / 72;
                Matrix2D matrix = page.GetDisplayMatrix(-1 * (int)(rectf.left), -(int)(page.GetHeight() - rectf.top), (int)(page.GetWidth() * pro_x), (int)(page.GetHeight() * pro_y), Rotation.e_Rotation0);//page.GetDisplayMatrix(0,0, width, height, page.GetRotation());
                rectf.left = rectf.left * pro_x;
                rectf.right = (rectf.right * pro_x);
                rectf.bottom = (rectf.bottom * pro_y);
                rectf.top = rectf.top * pro_y;

                using (Bitmap bitmap = new Bitmap((int)rectf.Width(), (int)rectf.Height(), Bitmap.DIBFormat.e_DIBArgb, IntPtr.Zero, 0))
                {
                    using (Renderer render = new Renderer(bitmap, false))
                    {
                        //开始渲染
                        render.StartRender(page, matrix, null);
                        {
                            using (Image image = new Image())
                            {
                                image.AddFrame(bitmap);
                                image.SetDPIs(dpi_x, dpi_y);
                                //保存图片
                                image.SaveAs(savePath+" test_" + page.GetIndex() + ".jpg");
                            }
                        }
                    }
                }
                rectf.Dispose();
                matrix.Dispose();
            }

        }

        static void Main(string[] args)
        {
            ErrorCode error_code = Library.Initialize(sn, key);
            if (error_code != ErrorCode.e_ErrSuccess)
            {
                Console.WriteLine("Library Initialize Error: {0}\n", error_code);
                return;
            }
            String savePath = @"D:\DownLoad\output\";
            //转成指定分辨率的图片
            using (PDFDoc doc = new PDFDoc(@"D:\DownLoad\output\AboutFoxit.pdf"))
            {
                doc.Load(null);
                for (int i = 0; i < doc.GetPageCount(); i++)
                {
                    using (PDFPage page = new PDFPage(doc.GetPage(i)))
                    {

                        Page2Bitmap(page, 72, 72, savePath);
                    }
                }
            }
            
            //图片插入PDF,页面大小适应图片尺寸
            using (Image image = new Image(savePath + "test_1.jpg"))
            using (PDFDoc doc = new PDFDoc())
            {
                int w = image.GetWidth(), h = image.GetHeight();
                using (PDFPage page = doc.InsertPage(0, w, h))
                {
                    page.AddImage(image, 0, new foxit.common.fxcrt.PointF(0, 0), w, h, true);
                }
            }

            //PDF导出txt
            using (var doc = new PDFDoc(@"D:\DownLoad\output\AboutFoxit.pdf"))
            {
                doc.Load(null);

                using (var writer = new StreamWriter(savePath + "pdf2text.txt", false, System.Text.Encoding.Unicode))
                {
                    int pageCount = doc.GetPageCount();
                    for (int i = 0; i < pageCount; i++)
                    {
                        using (var page = doc.GetPage(i))
                        {
                            page.StartParse((int)PDFPage.ParseFlags.e_ParsePageNormal, null, false);
                            using (var text_select = new TextPage(page, (int)TextPage.TextParseFlags.e_ParseTextUseStreamOrder))
                            {

                                String chars = text_select.GetText(TextPage.TextOrderFlag.e_TextDisplayOrder);
                                writer.Write(chars);

                            }
                        }
                    }
                    writer.Close();
                }
            }
            Library.Release();
        }
    }
}

相关内容

RDK Android 如何设置单页上下滑动翻页?

PDF转Word时,如何仅处理指定页面?

PDF和OFD如何批量互转?

Bitmap 类如何与其他的图像类互转?

打印管理PrintManager怎么判断文档打印是否完成?

软件如何打开嵌入在office文档中Adobe PDF图标

福昕高级PDF编辑器专业版如何在文档中嵌入一个3D模型

福昕高级PDF编辑器专业版如何实现对图片和文档内容添加马赛克

福昕高级PDF编辑器如何显示注释内容图标

福昕高级PDF编辑器如何添加和调整快速访问工具栏功能

推荐内容

RDK Android 如何设置单页上下滑动翻页?

PDF转Word时,如何仅处理指定页面?

PDF和OFD如何批量互转?

Bitmap 类如何与其他的图像类互转?

打印管理PrintManager怎么判断文档打印是否完成?

软件如何打开嵌入在office文档中Adobe PDF图标

福昕高级PDF编辑器专业版如何在文档中嵌入一个3D模型

福昕高级PDF编辑器专业版如何实现对图片和文档内容添加马赛克

福昕高级PDF编辑器如何显示注释内容图标

福昕高级PDF编辑器如何添加和调整快速访问工具栏功能

产品
  • 应用行业
  • 白皮书
开发支持
  • 开发中心
  • SDK文档资料

销售咨询:010-50951668

客服电话:0591-38509808

销售咨询
微信公众号

©2026 福建福昕软件开发股份有限公司 版权所有

隐私策略