Pet*_*ton 5 java railo jai cfimage cfml
我正在使用Railo中的ImageNew(及相关)创建图像,它使用了JAI.
当我保存图像时,我得到一个24位PNG,但我只需要8位.(只需使用图形编辑器将文件重新保存为8位,就会产生四分之一到一半的字节数.)
ImageWrite没有提供有关PNG位深度的任何功能,我也找不到任何与JAI本身相关的细节(获取http://jai-core.dev.java.net/的DNS错误)
更新:
使用Quantize ImageFilter我可以将颜色数量减少到256 - 这会显着减小文件大小(但仍然没有手动处理),但仍然会产生24位/未调整的PNG文件.不幸的是,它还删除了我需要保留的透明度(或至少重新应用).
如果我通过OptiPNG(一个无损PNG优化器)生成并生成它的文件,它会生成索引的8位文件并削减相当多的字节并提供可接受的文件大小.
所以,这个难题的剩余步骤:如何在ImageFilter删除它之后重新应用透明度(或者更好,防止它被删除).
我想我需要一些方法来做Image.replace('white','transparent')一个基于Railo/Java的解决方案,或者一个跨平台的命令行工具.
好的,所以我有一个可以产生可接受结果的工作解决方案 - 最终文件比我原来的手动过程稍小,但在视觉上无法区分。
该解决方案并不像我想要的那样跨平台(需要为 OptiPNG 查找/构建 Linux 二进制文件),但它仍然是一个足够好的解决方案。
正如 Leigh 在问题评论中建议的那样,我使用的是量化器来减少颜色,然后使用 MapColorsFilter 来修复量化器破坏透明度的事实,最后使用 OptiPNG 将生成的文件压缩到合理的大小。
这是相关代码:
<cfscript>
var Filename = './filename.png'
var MyImage = NewImage(Filename)
ImageFilter(MyImage,'quantize',{numColors:256,dither:false})
// ImageFilter(MyImage,'MapColors',{oldColor:'white',newColor:'ffffff00'})
var TransImage = ImageMapColors(MyImage,'white','ffffff00')
ImageWrite( TransImage , Filename )
</cfscript>
<cfexecute
name = "#Variables.OptiPngExecutable#"
arguments = "-o9 #Filename#"
timeout = 30
/>
Run Code Online (Sandbox Code Playgroud)
目前 Railo 的 ImageFilter 中的 MapColors 过滤器存在错误,因此我必须直接访问该过滤器,这是我用来解决该问题的代码:
<cffunction name="ImageMapColors" output=false >
<cfargument name="Image" rtype="Image" required />
<cfargument name="Old" type="String" required />
<cfargument name="New" type="String" required />
<cfset var ObjKey = 'ColorReplacer_#Arguments.Old#_#Arguments.New#' />
<cfif NOT StructKeyExists(Variables,ObjKey)>
<cfset var Old = createObject('java','railo.commons.color.ColorCaster').toColor(Arguments.Old) />
<cfset var New = createObject('java','railo.commons.color.ColorCaster').toColor(Arguments.New) />
<cfset Variables[ObjKey] = createObject("java","railo.runtime.img.filter.MapColorsFilter")
.init(Old.getRGB(),New.getRGB()) />
</cfif>
<cfreturn ImageNew( Variables[ObjKey].filter(ImageGetBufferedImage(Arguments.Image),{}) ) />
</cffunction>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1707 次 |
| 最近记录: |