【问题标题】:php: Storing images in databasephp:将图像存储在数据库中
【发布时间】:2011-03-01 00:52:06
【问题描述】:

目前我正在使用 gd 来转换以 jpg 格式上传的图片

imagjpeg($data,NULL,85)

并将其存储在 blob mysql 字段中。问题是质量。是的,质量很糟糕。带有一些文本的窗口的屏幕截图变得非常漂亮。 (虽然有游戏截图,但质量还可以)

我应该使用 GD 以外的其他库吗? 我应该使用其他 gd 格式吗? (图片png?)

ps。请注意:这不是重复的.. 我不是在问如何将 img 保存到 db

ps2。请注意,如果我应该更改我当前的格式/方法,我必须转换已经在我的数据库中存储为 jpg 的 5000-6000 张图像

ps3。我使用 85 作为 imagejpeg,不能使用更高的值,因为图像大小会比原始版本增长更多

ps4。我需要将图像存储在数据库中,请留在主题中

谢谢大家

=================================

重新表述问题

imagejpeg($resourceFromImageCreateFromString,NULL,85);imagejpeg($resourceFromImageCreateFromString,NULL,85);之后,我将图像(主要是软件截图,有时是游戏截图)保存在 BLOB 字段中

我遇到的问题是上传的图片与原始图片相比看起来很糟糕,即使它的大小相同。 (有时会因为 85 而变大)

imagejpeg 实现很烂吗?

ps。我的简单上传脚本执行以下调用:

upload file
open it with "rb" (binary)
pass the data to imagecreatefromstring
pass the result to imagejpeg

再次感谢

【问题讨论】:

  • 您是否监控了为 jpg 设置的压缩质量?默认是75,试试100? php.net/manual/fr/function.imagejpeg.php
  • 您究竟在使用 imagecopyresampled 做什么?降低图像分辨率?拍摄 1000x1000 的图像,重新采样到 100x100,然后再将其放大,不会再次得到原始图像。
  • 为什么不直接存储图像而不重新采样呢?
  • 抱歉编辑了,我不使用 imagecopyresemlaed。如果图像大于“x”值,我只使用它来缩小尺寸。大多数时候不是,但图像质量仍然很差
  • @yes123 如果您在重新采样以标准化存储类型时遇到很多问题,为什么不添加一个具有图像类型的列,这样您就不必重新采样任何东西,除非它过大。

标签: php mysql gd


【解决方案1】:

您是否有特殊原因要将图像存储在 BLOB 中? 您将什么质量参数传递给 imagejpeg()?

【讨论】:

    【解决方案2】:

    您可以将第三个参数的输出质量设置为imagejpeg()。问题在于 JPEG 不是具有大量文本的图像的最佳格式 - 您必须在降低质量并在图像中获得大量伪影之间进行选择,或者在提高质量并具有大文件大小之间做出选择。您可以考虑改用 PNG。

    【讨论】:

      【解决方案3】:

      我的第一个建议是尝试将其保存为 png,因为质量更好。

      我的第二个建议是尝试imagejpeg($image, $filename, $quality) 中的质量参数。

      建议 #3 - 我在一个网站上工作,我不得不重写图像存储系统,因为他们实现了你正在做的事情,将图像存储为数据库中的 BLOBs。他们的系统中只有大约 20K 图像,而且由于数据库无法处理负载,每周都会崩溃。

      无论图像有多大,5-6K 图像的转换过程都不会超过几个小时。当我将图像从 db 存储转换为磁盘存储时,我一次运行 1K 图像,每次运行需要 5-10 分钟。

      【讨论】:

        【解决方案4】:

        如果它已经是 jpeg,为什么还要重新编码?为了节省空间?好吧,但是您已经有了答案,部分原因是-为了节省从 jpg 到 jpg 的空间,您必须以较低的质量进行保存。

        您无法使用 imagecopyresampled 指定质量,但可以使用 imagejpeg。为质量参数使用更高的值。

        请注意,JPEG 是一种为存储 FOTOS 而优化的格式。具有相同颜色、直线等的大面积图像更适合以 PNG 等无损格式存储。当然,如果您的屏幕截图是从带有照片作为桌面背景的屏幕截取的,那么您可以同时拥有这两种元素 - 因此请根据您的需要选择格式。如果照片部分更重要并且您不太关心字体和线条,请使用 jpeg。当然,对于屏幕截图,JPEG 的质量也可以与 PNG 一样好,但是您会错过它的大部分压缩功能,您必须使用 90+% 的质量设置。 100% JPEG 也是无损的,但到那时 PNG 可能实际上是更小的(文件)大小。

        【讨论】:

        • 标准 JPEG 绝不是无损的,即使在 100 质量下也是如此。
        • 好点,但在 100% 时您需要放大很多才能看到明显的退化,所以出于所有实际目的......我们在这里谈论的是屏幕截图,而不是医学 X 射线图像:)
        • 如果我指定 imagejpeg 的质量为 100,则图像会比原始 jpg 图像大。这很愚蠢
        • 这就是我所说的(或想要的),这就是我指向 PNG 的原因。其实,看我最后一句话。保存具有更高质量的 JPEG,因为它最初保存(甚至接近)当然是没有意义的,因此我认为不需要提及它,只有选择(低得多)质量才有意义。
        猜你喜欢
        • 2012-10-17
        • 2017-07-24
        • 2011-04-15
        • 2011-05-07
        • 1970-01-01
        • 2015-01-01
        相关资源
        最近更新 更多