Oracle 数据库。如何压缩 BLOB 图像列并保留图像类型

问题描述 投票:0回答:1

我希望提取、压缩并上传一些存储在 BLOB DB 列中的图像。我尝试过这个方法

CREATE OR REPLACE procedure CompressImg (p_id in varchar2) as
v_blob_column blob;
 begin  

  FOR crs IN (SELECT id_img, img FROM  TabImages where id = p_id) 
  LOOP
  v_blob_column := utl_compress.lz_compress(crs.img);
  insert into TabCompressedImages(id, id_img, img) values(p_id, crs.id_img,v_blob_column);
  END LOOP;

end CompressImg;
/

这可行,但压缩的 blob 已损坏!通过简单的扩展检查

选择 DBMS_LOB.SUBSTR(IMG,2,1) FROM ....

原来的 blob 文件(TabImages.img)返回“FFD8”字符串(即:jpg 文件),而压缩文件(TabCompressedImages.img)返回“1F8B”。 因此,看起来压缩过程已损坏 blob 文件。如何压缩它们并保留原始格式?谢谢

oracle image compression blob
1个回答
0
投票

想象一个非常简单的示例,其中压缩数字可以通过向其添加 5 来表示。如果您有一个值 42,并将其压缩并将其存储在数据库中,那么您将存储 47,然后当您从数据库中读取该值时,您将看到压缩值 47,而不是原始值 42。

如果你想看到原始值,那么你必须通过相反的过程来解压缩压缩后的值;在这个简单的示例中,解压缩将从数字中减去 5,因此我们需要解压缩该值,然后我们就回到原始值。

当您想获取压缩图像时,可以:

  1. 读取压缩后的图片,将压缩后的图片原样发送给用户,并告知用户如何解压该值,让用户在客户端解压;或
  2. 读取压缩图片,解压,然后将解压后的图片发送给用户。

因此,对于简化的示例,您可以选择:

  • 向用户发送值 47 并告诉他们在收到该值时必须解压缩该值并告诉他们如何解压缩该值(即减去 5);或
  • 您可以减去 5 并发送原始值 42,然后接收用户不需要知道您如何存储该值的任何信息。

看起来压缩过程已损坏 blob 文件。

文件没有损坏,它们已被压缩(您告诉数据库执行压缩)。

如何压缩它们并保留原始格式?

你不能,文件格式和压缩不是这样工作的。压缩获取文件中的数据并以更紧凑的格式重写它,但在大多数情况下1,压缩后的数据不再立即被识别为原始文件格式(直到您解压缩并恢复原始文件)。

如果您想查看压缩文件中的图像,请反转压缩过程并使用

UTL_COMPRESS.LZ_UNCOMPRESS
解压缩。

1 有些图像文件格式(例如 PNG、JPEG 或 TIFF)具有内置压缩功能,您可以调整压缩级别,并且可以使用较高压缩级别重新保存较低压缩级别的图像,以及它仍然是一个图像,但您没有使用它来压缩图像(而且我不知道有任何内置 Oracle 函数支持此类图像操作);您正在使用 LZ 压缩,这会将文件重写为不同的格式。

© www.soinside.com 2019 - 2024. All rights reserved.