【问题标题】:Converting raw image data into a physical file将原始图像数据转换为物理文件
【发布时间】:2026-01-18 13:40:02
【问题描述】:

我正在调用基于 RETS 的服务来收集有关房产列表的数据……当然,这方面的一个主要方面是获取照片。但是,照片的数据实际上是原始图像数据:

ÿØÿàJFIF``ÿá"ExifII*îhÿÛC       $.' ",#(7),01444'9=82<.342ÿÛC     2!!22222222222222222222222222222222222222222222222222ÿÀU"ÿÄ    ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚  %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ    ÿĵw!1AQaq"2B‘¡±Á  #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ 

等等等等等等……

如何转换/使用这些原始数据并将其转换为网络服务器上的物理文件?

【问题讨论】:

  • 如果您知道它是什么文件类型(我猜是 JPG),只需将此原始数据写入具有适当扩展名的文件即可。这应该有效。
  • 是的,它是 jpeg(字节 4-7 中的 JFIF)

标签: php image image-processing rets


【解决方案1】:

尝试简单地将这些原始数据写入文件。如果您确定文件格式始终为 JPG,则将 .jpg 设置为扩展名。

如果没有,您可能想看看here - 这应该可以帮助您获得正确的文件格式,然后设置适当的文件扩展名。

编辑我不知道 RETS 协议,但它可能会返回图像的内容类型,这应该会进一步简化整个过程。 :)

【讨论】:

    【解决方案2】:

    此外,如果您在对给定列表的所有照片使用 GetObject 请求时在流中获取多个 jpeg,则可以拆分 ÿØÿà 字节 (\xff\xd8\xff\xe0) 并保存每个字节流拆分为 jpeg 文件的结果,但您必须在每个 jpeg 的开头保留 ÿØÿà,因此您需要在拆分后在每个块的开头重新插入它们。我也从“类似RETS”的服务中遇到了这个问题,并且不得不手动将下标(_1、_2 等)添加到拆分产生的 jpeg 文件名中。结果是这样的:

    if response.find('\xff\xd8\xff\xe0') > -1:
        blist = response.split('\xff\xd8\xff\xe0')
        blist.remove("")  /* get rid of any empty list elements resulting from split */
        index = 1
        for img in blist:
            file_nm = os.path.join(photo_dir, "{0}_{1}.jpg".format(photo_id, index))
            with open(photo_file_nm, "wb") as photo_file:
                photo_file.write('\xff\xd8\xff\xe0' + img)
            index += 1
    

    ...其中 photo_dir 和 photo_id 在此块之外定义。这个例子是 python,但可以很容易地转换为 php。

    【讨论】:

      【解决方案3】:

      您必须从 RETS 服务器解析 mime 多部分对象。您可以手动获取每一行并将其分块在 mime 分隔符字符串中,您还必须弄清楚它在标题中的位置。

      如果您想节省时间,请查看phrets class 源代码(或直接使用)。 https://github.com/troydavisson/PHRETS/blob/master/phrets.php#L141

      这里有一些例子, https://github.com/troydavisson/PHRETS/wiki/GetObject

      【讨论】: