我希望提取、压缩并上传一些存储在 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 文件。如何压缩它们并保留原始格式?谢谢
想象一个非常简单的示例,其中压缩数字可以通过向其添加 5 来表示。如果您有一个值 42,并将其压缩并将其存储在数据库中,那么您将存储 47,然后当您从数据库中读取该值时,您将看到压缩值 47,而不是原始值 42。
如果你想看到原始值,那么你必须通过相反的过程来解压缩压缩后的值;在这个简单的示例中,解压缩将从数字中减去 5,因此我们需要解压缩该值,然后我们就回到原始值。
当您想获取压缩图像时,可以:
因此,对于简化的示例,您可以选择:
看起来压缩过程已损坏 blob 文件。
文件没有损坏,它们已被压缩(您告诉数据库执行压缩)。
如何压缩它们并保留原始格式?
你不能,文件格式和压缩不是这样工作的。压缩获取文件中的数据并以更紧凑的格式重写它,但在大多数情况下1,压缩后的数据不再立即被识别为原始文件格式(直到您解压缩并恢复原始文件)。
UTL_COMPRESS.LZ_UNCOMPRESS
解压缩。
1 有些图像文件格式(例如 PNG、JPEG 或 TIFF)具有内置压缩功能,您可以调整压缩级别,并且可以使用较高压缩级别重新保存较低压缩级别的图像,以及它仍然是一个图像,但您没有使用它来压缩图像(而且我不知道有任何内置 Oracle 函数支持此类图像操作);您正在使用 LZ 压缩,这会将文件重写为不同的格式。