我使用Freeimage 3.17.0 .NET以Jpeg2000(JP2)格式导出一些带有alpha的图像。当我在GIMP中加载导出的图像时,我可以看到他们有一个alpha通道,但他们似乎不兼容Safari,因为iOS和macOS中的Safari都将这些图像的alpha通道显示为黑色。 / p>
如果相反,我将图像导出为PNG并使用macOS中的预览工具将其保存到Jpeg2000,正确显示alpha。
我错过了JP2的任何标志吗?或者这是Freeimage中的错误?该项目自2015年以来一直没有更新......
修改(1): 我用十六进制编辑器查看输出文件,它以类似的东西开头,
....jP ..‡.....ftypjp2 ....jp2 ...³jp2h....ihdr
编辑(2):根据https://www.iana.org/assignments/media-types/image/jp2,图片应该确实以这些字节开始,
{ 0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A }
这两个图像,我用预览保存的图像,以及我用Freeimage保存的图像,都是从哪个图像开始的。
编辑(3):这是我写过的一些单元测试,
using(var bmp = new Bitmap("myimage.png"))
using(var fibm = new FreeImageBitmap(bmp))
{
fibm.Save("myimage-0.jp2", FREE_IMAGE_FORMAT.FIF_JP2, FREE_IMAGE_SAVE_FLAGS.DEFAULT);
fibm.Save("myimage-64.jp2", FREE_IMAGE_FORMAT.FIF_JP2, (FREE_IMAGE_SAVE_FLAGS)64);
}
我用它创建的图像似乎在缓冲区的开头有正确的幻数。但仍然是macOS& Safari认为那些图像没有alpha ...另外,我创建了一个非常小的2x2 PNG图像,其中包含GIMP中的alpha,139个字节,并尝试使用上面的代码保存它,但FreeImage会抛出异常," Unable保存位图"。问题出在Dll内部,所以我没有设法从C#中抛弃。我尝试使用macOS Preview将其导出到JP2并且它可以工作,虽然生成了3.9KB的大图像......虽然它看起来大部分都是嵌入的颜色配置文件...
编辑(4):我已将Freeimage SVN存储库导入Github,修复了构建问题,并尝试将OpenJpeg更新到版本2.3.0(我相信Freeimage使用2.1。 0 atm)。目前,我只是手动构建OpenJpeg库并在Freeimage中静态链接到它。这是我的存储库中相应分支的链接,带有README,
https://github.com/endavid/freeimage/tree/openjpeg2.3.0/FreeImage/Source/openjpeg
虽然OpenJpeg 2.3.0本身(它附带了几个用于转换的二进制应用程序)确实产生了正确的输出,即Safari理解它具有alpha的图像,FreeImage的输出,即使使用更新的OpenJpeg,也是仍然不好。所以它看起来像是FreeImage中的一个错误......