Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos PNG格式的图像不会显示在Mac Safari上_Macos_Safari_Png_Photoshop_Zopfli - Fatal编程技术网

Macos PNG格式的图像不会显示在Mac Safari上

Macos PNG格式的图像不会显示在Mac Safari上,macos,safari,png,photoshop,zopfli,Macos,Safari,Png,Photoshop,Zopfli,对于一些Mac用户,我们网站上的图像不会在Safari中显示,他们报告说没有看到图像或看到黑色图像。以下是一个例子: 我发现: 在PC上显示图像 图像显示在一些Mac电脑上(我有一个旧的可以) iPhone和iPad上显示的图像 图像是PNG 我用pngtastic优化了图像 当图像被复制到Mac并用Adobe Photoshop打开时,它们会给出错误:文件格式模块无法解析文件 当我试图在Windows上的Photoshop Elements中打开一个pngtastic优化文件时,我也遇到了

对于一些Mac用户,我们网站上的图像不会在Safari中显示,他们报告说没有看到图像或看到黑色图像。以下是一个例子:

我发现:

  • 在PC上显示图像
  • 图像显示在一些Mac电脑上(我有一个旧的可以)
  • iPhone和iPad上显示的图像
  • 图像是PNG
  • 我用pngtastic优化了图像
  • 当图像被复制到Mac并用Adobe Photoshop打开时,它们会给出错误:文件格式模块无法解析文件
  • 当我试图在Windows上的Photoshop Elements中打开一个pngtastic优化文件时,我也遇到了这个错误
  • 当我试图在Windows上的Photoshop中打开优化后的文件时,我收到错误IDAT:错误数据检查

我将用未优化的图像替换优化后的图像,但我不确定这是否是pngtastic或Adobe图像库或其他问题

问题似乎是由于在PNG中使用了zopfli压缩,我使用pngtastic对其进行了优化。解决方法是使用不同的PNG压缩选项,然后在Photoshop中读取PNG

使用不同的压缩算法将减少优化

我不确定zopfli压缩为什么会出现问题,可能是因为我的代码(尽管只有zopli选项被更改时,相同的代码可以正常工作)、pngtastic中存在错误,或者MacOS和Adobe不支持zopfli

@usr2564301已经做了一些调查,我的示例图像中压缩数据的Adler-32校验和似乎不正确。usr2564301还测试了pngtastic代码,发现它可以生成正确的校验和。问题可能在于我如何处理pngtastic的ByTestStream

下面的代码使用pngtastic(com.googlecode.pngtastic.core)执行PNG优化


问题在于pngtastic包含的
Zopfli.java

它使用以下Java代码计算Adler-32校验和:

/**
*计算数据的adler32校验和
*/
专用静态int adler32(字节[]数据){
int s1=1;
int s2=1>>16;
int i=0;
而(ireturn(s2解决问题了吗?我也收到Safari用户关于没有看到PNG的投诉,但是这些PNG是用PHP(标准GD库)中的
ImageCreateTureColor
创建的),没有以任何方式“优化”。@Marten-是的,用未优化的图像替换可以查看它们。我希望有时间进一步研究这个问题,并报告我的发现。非常有趣。这些图像是否通过
pngcheck
?很好。这是引导我找到解决方法的线索。当我在fi上运行pngcheck时le我得到了错误:“zlib:inflate error=-3”,这向我建议尝试不同的压缩,但我不知道zopfli的问题是什么,也不知道为什么一些机器或应用程序可以读取它。这是令人担忧的原因——不仅仅是PNG用户。据称“…Zopfli是与gzip、Zip、PNG等中使用的压缩兼容的位流”(简而言之:Flate)你的经验表明并非如此。马克·阿德勒是这里的常客,他可能很感兴趣。我明白你的意思。如果马克·阿德勒需要,我很荣幸为他提供帮助。OP中链接的png文件仍然在那里进行分析。我确实认为问题可能是由我自己的代码引起的,但因为它只是处理数据在pngtastic内外,当有不同的压缩选项(在方法调用中更改参数)时,创建有效的PNG。很难看出这是怎么回事(希望我没有被自己的惊人之处蒙蔽了双眼;)我花了一些时间深入到核心,但示例文件中的错误在于
zlib
流末尾的Adler-32校验和。这可能是由您的代码部分引起的吗?我验证了
zopfli
s adler32函数,它返回正确的值
1BCD6EB2
,与Python相同(我用它来判断问题)。感谢您的调查!我已向pngtastic项目报告了此问题:感谢您跟踪此问题!我已根据这些发现推出了一个新的pngtastic发行版,并提供了一个修复程序。如果上游项目能收到关于此类问题的通知,那将是一件好事。事实上,代码应该是这样的:
s1+=data[I++]&0xFF;
。已修复并经过彻底测试。
public static final String OPT_ZOPFLI = "zopfli";
public static final String OPT_DEFAULT = "default";
public static final String OPT_IMAGEOPTIM = "imageoptim";

private String optimization = OPT_ZOPFLI;

public void optimizePng(File infile, String out) {

     final InputStream in;
     try {
         in = new BufferedInputStream(new FileInputStream(infile));
         final PngImage image = new PngImage(in);

         // optimize
         final PngOptimizer optimizer = new PngOptimizer();

         optimizer.setCompressor(optimization, 1);
         final PngImage optimizedImage = optimizer.optimize(image, false, 9);

         // export the optimized image to a new file
         final ByteArrayOutputStream optimizedBytes = new ByteArrayOutputStream();
         optimizedImage.writeDataOutputStream(optimizedBytes);
         optimizedImage.export(out, optimizedBytes.toByteArray());

       } catch (FileNotFoundException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }
 }