如何使用 Wand 从二进制字符串创建高分辨率 JPEG

2024-02-13

我正在尝试使用 imagemagick 将一些 PDF 转换为高分辨率 jpeg 。我正在使用 python 3.62 - 64 位和 wand 0.4.4 开发 win 10、64。在命令行我有:

$ /e/ImageMagick-6.9.9-Q16-HDRI/convert.exe -density 400 myfile.pdf -scale 2000x1000 test3.jpg.

这对我来说效果很好。

在Python中:

from wand.image import Image

file_path = os.path.dirname(os.path.abspath(__file__))+os.sep+"myfile.pdf"

with Image(filename=file_path, resolution=400) as image:
    image.save()
    image_jpeg = image.convert('jpeg')

这给了我低分辨率的 JPEG。我如何将其翻译成我的魔杖代码来完成同样的事情?

edit:

我意识到问题在于输入 pdf 必须作为二进制字符串读入 Image 对象,因此基于http://docs.wand-py.org/en/0.4.4/guide/read.html#read-blob http://docs.wand-py.org/en/0.4.4/guide/read.html#read-blob我试过:

with open(file_path,'rb') as f:
    image_binary = f.read()

f.close()

with Image(blob=image_binary,resolution=400) as img:
    img.transform('2000x1000', '100%')
    img.make_blob('jpeg')
    img.save(filename='out.jpg')

这可以正常读取文件,但输出被分成 10 个文件。为什么?我需要将其转换为 1 个高分辨率 jpeg。

EDIT:

我需要将 jpeg 发送到 OCR api,所以我想知道是否可以将输出写入类似对象的文件。看着https://www.imagemagick.org/api/magick-image.php#MagickWriteImageFile https://www.imagemagick.org/api/magick-image.php#MagickWriteImageFile, 我试过 :

emptyFile =  Image(width=1500, height=2000)

with Image(filename=file_path, resolution=400) as image:

    library.MagickResetIterator(image.wand)
    # Call C-API Append method.
    resource_pointer = library.MagickAppendImages(image.wand,
                                                  True)

    library.MagickWriteImagesFile(resource_pointer,emptyFile)

这给出:

 File "E:/ENVS/r3/pdfminer.six/ocr_space.py", line 113, in <module>
test_file = ocr_stream(filename='test4.jpg')
 File "E:/ENVS/r3/pdfminer.six/ocr_space.py", line 96, in ocr_stream
library.MagickWriteImagesFile(resource_pointer,emptyFile)
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type

我怎样才能让它发挥作用?


为什么?我需要将其转换为 1 个高分辨率 jpeg。

PDF 包含 ImageMagick 将各个图像视为“堆栈”的页面。这wand /questions/tagged/wand图书馆提供了一个wand.image.Image.sequance处理每个页面。

然而,要附加all图像转换为单个 JPEG。您可以迭代每个页面并将它们缝合在一起,或者调用 C-API 的方法MagickAppendImages.

from wand.image import Image
from wand.api import library
import ctypes

# Map C-API not provided by wand library.
library.MagickAppendImages.argtypes = [ctypes.c_void_p, ctypes.c_int]
library.MagickAppendImages.restype = ctypes.c_void_p

with Image(filename="path_to_document.pdf", resolution=400) as image:
    # Do all your preprocessing first
    # Ether word directly on the wand instance, or iterate over each page.
    # ...
    # To write all "pages" into a single image.
    # Reset the stack iterator.
    library.MagickResetIterator(image.wand)                    
    # Call C-API Append method.
    resource_pointer = library.MagickAppendImages(image.wand,
                                                  True)        
    # Write C resource directly to disk.
    library.MagickWriteImages(resource_pointer,                
                              "output.jpeg".encode("ASCII"),
                              False)

Update:

我需要将 jpeg 发送到 OCR api ...

假设您使用 OpenCV 的 python API,您只需要迭代每个页面,并通过 numpy 缓冲区将图像文件数据传递到 OCR。

from wand.image import Image
import numpy
import cv2

def ocr_process(file_data_buffer):
     """ Replace with whatever your OCR-API calls for """
     mat_instance = cv2.imdecode(file_data_buffer)
     # ... work ...

source_image="path_to_document.pdf"
with Image(filename=source_image, resolution=400) as img:
    for page in img.sequence:
        file_buffer = numpy.asarray(bytearray(page.make_blob("JPEG")),
                                    dtype=numpy.uint8)
        ocr_process(file_buffer)

所以我想知道是否可以将输出写入类似对象的文件

不要假设来自不同库的 python“图像”对象(或下划线 C 结构)彼此具有可比性。

如果不了解 OCR api,我无法帮助您通过wand /questions/tagged/wand部分,但我可以建议以下之一......

  • 使用临时中间文件。 (I/O 较慢,但更容易学习/开发/调试)

    with Image(filename=INPUT_PATH) as img:
        # work
        img.save(filename=OUTPUT_PATH)
    # OCR work on OUTPUT_PATH
    
  • 如果 OCR API 支持,请使用文件描述符。 (同上)

    with open(INPUT_PATH, 'rb') as fd:
        with Image(file=fd) as img:
            # work
            # OCR work ???
    
  • 使用斑点。 (更快的 I/O 但需要lot更多内存)

    buffer = None
    with Image(filename=INPUT_PATH) as img:
        # work
        buffer = img.make_blob(FORMAT)
    if buffer:
        # OCR work ???
    

更多更新

将所有评论放在一起,解决方案可能是......

from wand.image import Image
from wand.api import library
import ctypes
import requests

# Map C-API not provided by wand library.
library.MagickAppendImages.argtypes = [ctypes.c_void_p, ctypes.c_int]
library.MagickAppendImages.restype = ctypes.c_void_p

with Image(filename='path_to_document.pdf', resolution=400) as image:
    # ... Do pre-processing ...
    # Reset the stack iterator.
    library.MagickResetIterator(image.wand)
    # Call C-API Append method.
    resource_pointer = library.MagickAppendImages(image.wand, True)
    # Convert to JPEG.
    library.MagickSetImageFormat(resource_pointer, b'JPEG')
    # Create size sentinel.
    length = ctypes.c_size_t()
    # Write image blob to memory.
    image_data_pointer = library.MagickGetImagesBlob(resource_pointer,
                                                     ctypes.byref(length))
    # Ensure success
    if image_data_pointer and length.value:
        # Create buffer from memory address
        payload = ctypes.string_at(image_data_pointer, length.value)
        # Define local filename.
        payload_filename = 'my_hires_image.jpg'
        # Post payload as multipart encoded image file with filename.
        requests.post(THE_URL, files={'file': (payload_filename, payload)})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Wand 从二进制字符串创建高分辨率 JPEG 的相关文章

随机推荐

  • 如何使用 Google Translator Api 将转换后的英文文本设置到另一个文本框?

    我有两个文本框 一个用于英语 另一个用于印地语 当我在第一个框中输入英语时 文本应在第二个框中显示为印地语版本 在按键事件上 我已经提到了一个例子如何在您的网站中通过 Google API 将英语翻译成印地语 http arunsonare
  • 单选按钮检查事件处理

    在我的应用程序中 我需要一个单选组 每当选中单选按钮时 就会出现警报 以便我可以使用 jQuery 将其值发布到 ajax post 你能帮我看看我如何在 jQuery 中做到这一点吗 尝试这样的事情 function input type
  • 使用自签名证书是否可以防止中间人攻击?

    我不确定以前是否有人问过类似的问题 我找不到任何问题 但是是否可以保护客户端 服务器免受中间人攻击 我正在编写一个客户端应用程序来与服务器进行通信 通信将基于 SSLv3 我对服务器的自签名证书没问题 但担心其他人以相同的服务器名称生成相同
  • 推送到 git 时出现非快进错误

    我得到了一个non fast forward尝试推送到 WordPress git 存储库时出错 但像错误消息所说的那样拉动会给我一条消息 表明一切都是最新的 这是在拉取 合并和提交之后 这是我的日志 http pastebin com 6
  • linux任务集:多线程进程的线程是否始终在特定核心上运行?

    我使用任务集设置多线程进程在 Linux 主机上运行 如下所示 任务 c 1 2 myprocess 特定线程是否总是在特定 CPU 上运行 例如线程 1 总是在 c1 上运行 或者它会在不同时间在 c1 或 c2 上运行 不 过滤器应用于
  • VueJs 模板。如何加载外部模板

    我是 Vue js 的新手 我使用 AngularJS 一段时间了 在 Angular 中我们用来加载模板 例如 template sometemplate html controller someCtrl 我们如何在 Vue 中做这样的事
  • 如何根据我的应用程序版本自动设置 Inno Setup 安装程序的版本?

    我正在使用 Inno Setup 来生成我的应用程序的安装程序 如何设置setup exe的版本号 VersionInfoVersion 由 Inno 生成以自动与我的应用程序的版本号匹配 现在 每次部署应用程序的新版本时 我都需要手动更新
  • 防止出现滚动条时居中布局移动其位置

    我的页面布局看起来像这样的东西 http jsfiddle net salman qxywp show div div 您会注意到 当垂直滚动条出现时 内容换行 div 的位置稍微移动了一点 一种情况是当浏览器开始逐步呈现页面而不显示垂直滚
  • 测试 Windows 安装程序

    我在一家软件公司工作 我们有一个适用于 Windows 操作系统的产品 可以使用自定义安装程序进行安装 我们希望拥有一个每天运行安装程序的自动化系统 确保所有内容均已安装且正常运行 应用程序已安装 出现在 添加 删除 中 创建快捷方式 创建
  • 如何在Processing中创建3D平台游戏,包括玩家移动、熔岩和移动块障碍物?

    这非常重要请帮忙 我想在这段代码中添加以下功能 我创建的玩家可以停留在我创建的阶段的顶部 并且无法通过它 如果玩家触及熔岩 游戏就会停止并写上 你输了 如果玩家来到我按下熔岩时创建的终端平台 你赢了 写下来 让我创建的阶段在 y 轴上上下移
  • 使用笑话模拟时出现打字稿错误

    我有一个之前创建的 js文件模拟了我们的一些功能jest测试目的 我正在将其迁移到 ts file 服务器 ts const Server jest genMockFromModule Server Server getAsync Serv
  • Haskell 中 split 的一行实现

    我想要的是以下内容 我认为应该包含在序言中 因为它在文本处理中非常有用 split Eq a gt a gt a gt a e g split hello world hello world split from Data List Uti
  • 在 RecyclerView 或 Grouping Recyclerview items 中按组划分元素,例如按日期

    我想对我的 android 进行分组RecyclerView带有基于日期的标题的项目 如下所示 1 week ago item item item item 2 weeks ago item item item 这类事情或基于某些元素的分组
  • 如何找到两个字符串之间的值?

    我如何 查找 和 获取 两个字符串之间的值 ie a 3 a 我正在读取文件以查找位置 a 从哪里开始 那么当它找到时就会停止读取 a 我想要返回的值是 3 使用 JRE 6 您的两个主要选择是 1 首选但可能很复杂 使用 XML HTML
  • SDLC 的敏捷与螺旋模型 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我相信敏捷只不过是螺旋模型的另一种实现 我从一开始就是 Spiral 的大力支持者 螺旋模型是一种结合了设计和阶段原型制作元素的软件开发过
  • 如何通过谷歌分析知道有多少收件人打开了电子邮件?

    我正在使用 swiftmailer 一个用于在 php 中发送邮件的库 问题是 我已经注册了一个谷歌分析帐户 如何使用此工具查看有多少人打开了电子邮件 谢谢 Updated 好吧 trackcode 在 js 中 肯定行不通 如果用户允许
  • 如何将 MS SQL Server 一个数据库中的所有表的所有列名更改为大写?

    是否有任何sql语句用于将数据库中所有表的所有列名更改为大写 微软 SQL 服务器 我有一个sql来做到这一点 但不确定它是否正确 运行下面的 SQL select exec sp rename b name a name UPPER a
  • 在 VSTS 构建过程中使用“dotnet pack”将构建号添加到包版本

    使用 NET Framework 库 您可以使用通配符指定版本 NUGET pack 命令将在 VSTS 中运行 NUGET 构建任务时自动附加构建日期和版本 assembly AssemblyVersion 1 0 NUGET PACK
  • 编译js失败反应本机预期缓冲区大小

    我的代码工作正常 然后突然开始显示如下错误 编译JS失败 180820 25 预期缓冲区大小 7070676 开头为 并具有保护模式 r p Error Screenshot 我尝试重置缓存 npx react native start r
  • 如何使用 Wand 从二进制字符串创建高分辨率 JPEG

    我正在尝试使用 imagemagick 将一些 PDF 转换为高分辨率 jpeg 我正在使用 python 3 62 64 位和 wand 0 4 4 开发 win 10 64 在命令行我有 e ImageMagick 6 9 9 Q16