代码之家  ›  专栏  ›  技术社区  ›  Reno

CF:将Fusioncharts图形保存为图像以通过电子邮件发送

  •  2
  • Reno  · 技术社区  · 11 年前

    有人有这样的例子吗?谷歌今晚不是我的朋友。我有最新版本的FusionCharts。我正试图弄清楚如何将图形保存为图像文件以通过电子邮件发送。

    我知道如何保存图像,然后将其插入HTML电子邮件,我以前在其他图形产品中也这样做过。我只是无法用Fusioncharts给出一个很好的例子来说明如何做到这一点。

    谢谢

    2 回复  |  直到 11 年前
        1
  •  1
  •   Antony    11 年前

    在模板中使用以下代码,并将imageSaveURL属性指向该模板。

    您的图表提交了要重建的图表所需的所有数据。在我的例子中,我将其提供给浏览器,但您可以将其保存在本地,然后连接到 cfmail 如有必要。

    我很确定我最初是从fusioncharts论坛上得到的。这是针对fusioncharts 3.1更新的。

    <cfif structKeyExists(Form, "width") >
        <cfset width = int(Form.width) />
    <cfelse>
        <cfset width = int(Form.Meta_Width) />
    </cfif>
    <cfif structKeyExists(Form, "height") >
        <cfset height = int(Form.height) />
    <cfelse>
        <cfset height = int(Form.Meta_Height) />
    </cfif>
    
    <cfif structKeyExists(Form, "data") >
        <cfset Form.data = Form.data />
    <cfelse>
        <cfif structKeyExists(Form, "stream") >
            <cfset Form.data = Form.stream />
        </cfif>
    </cfif>
    
    <cfset user = viewState.getValue("user", structNew()) />
    
    
    <!--- Impose some limits to mitigate DOS attacks --->
    <cfif Not (0 lte width and width lte 5000)>
        <cfthrow message="Width out of range." />
    </cfif>
    <cfif Not (0 lte height and height lte 5000)>
        <cfthrow message="Height out of range." />
    </cfif>
    
    
    <!--- Check if we have the chart data --->
    <cfif Not StructKeyExists(Form, "data") or Not Len(Trim( Form.data ))>
        <cfthrow message="Image Data not supplied." />
    </cfif>
    
    
    <!--- Default background color is white --->
    <cfif Not StructKeyExists(Form, "bgcolor") or Not Len(Trim( Form.bgcolor ))>
        <cfset Form.bgcolor = "FFFFFF" />
    </cfif>
    
    
    <cfset gColor = CreateObject("java", "java.awt.Color") />
    <cfset chart = CreateObject("java", "java.awt.image.BufferedImage") />
    <cfset chart.init( JavaCast("int", width), JavaCast("int", height), chart.TYPE_3BYTE_BGR) />
    <cfset gr = chart.createGraphics() />
    <cfset gr.setColor( gColor.decode("##" & Form.bgcolor) ) />
    <cfset gr.fillRect(0, 0, JavaCast("int", width), JavaCast("int", height)) />
    
    <!--- Get rows with pixels --->
    <cfset rows = ListToArray(Form.data, ";") />
    
    <cfloop from="1" to="#ArrayLen(rows)#" index="i">
    
        <cfset pixels = ListToArray(rows[i], ",") />
        <!--- Horizontal index (x scale) --->
        <cfset horizIndex = 0 />
    
        <cfloop from="1" to="#ArrayLen(pixels)#" index="j">
    
            <cfif ListLen(pixels[j], "_") eq 2>
                <!--- We have the color and the number of times it must be repeated --->
                <cfset color  = ListGetAt(pixels[j], 1, "_") />
                <cfset repeat = ListGetAt(pixels[j], 2, "_") />
            <cfelse>
                <!--- Background color; how many pixels to skip --->
                <cfset color  = "" />
                <cfset repeat = ListGetAt(pixels[j], 1, "_") />
            </cfif>
    
            <cfif Len(Trim(color))>
    
                <!---  If the hexadecimal code is less than 6 characters, prefix with 0 to get a 6 char color --->
                <cfif Len(Trim(color)) lt 6>
                    <cfset color = RepeatString(0, 6 - Len(Trim(color))) & color />
                </cfif>
    
                <!--- Draw a horizontal line for the number of pixels we must repeat --->
                <cfset gr.setColor(gColor.decode("##" & color)) />
                <cfset gr.drawLine(JavaCast("int", horizIndex), JavaCast("int", i - 1), JavaCast("int", horizIndex + repeat -1), JavaCast("int", i - 1)) />
            </cfif>
    
            <cfset horizIndex = horizIndex + repeat />
        </cfloop>
    
    </cfloop>
    
    <!--- Get writer for Jpeg --->
    <cfset writer = "" />
    <cfset iter = CreateObject("java", "javax.imageio.ImageIO").getImageWritersByFormatName("jpg") />
    <cfloop condition="iter.hasNext()">
        <cfset writer = iter.next() />
    </cfloop>
    
    <!--- Set Jpeg quality to maximum --->
    <cfset jpgParams = CreateObject("java", "javax.imageio.plugins.jpeg.JPEGImageWriteParam").init( CreateObject("java", "java.util.Locale").init("en") ) />
    <cfset jpgParams.setCompressionMode( jpgParams.MODE_EXPLICIT ) />
    <cfset jpgParams.setCompressionQuality( 1 ) />
    
    <!--- Write image to a memory stream --->
    <cfset imageOutput = CreateObject("java", "java.io.ByteArrayOutputStream").init() />
    <cfset writer.setOutput( CreateObject("java", "javax.imageio.stream.MemoryCacheImageOutputStream").init( imageOutput ) ) />
    <cfset writer.write(JavaCast("null", 0), CreateObject("java", "javax.imageio.IIOImage").init(chart, JavaCast("null", 0), JavaCast("null", 0)), jpgParams) />
    
    <!--- Stream the image to the browser (hint browser to display the Save dialog) --->
    <cfset filename="whatever.jpg" />
    <cfheader name="Content-Disposition" value="attachment; filename=""#filename#""">
    <cfcontent type="image/jpeg" variable="#imageOutput.toByteArray()#">
    
        2
  •  1
  •   Swarram    11 年前

    查看最新的博客文章 Export Chart Images at Server Side 其中描述了两个选项(wkhtmltoimage和PhantomJS.),并给出了这两个选项的分步说明。

    对于ColdFusion,您可以尝试以下代码:

    例如:

    <cfexecute name="C:\Program Files\wkhtmltopdf\wkhtmltoimage.exe" arguments="--javascript-delay 10000 http://docs.fusioncharts.com/charts/Code/MyFirstChart/ms-weekly-sales-no-animation.html savedimage.png" />
    

    在执行上述脚本时,我们提供了以下参数: 调用wkhtmltoimage 将网页的URL传递给它 传递保存图像的图像文件的路径和名称(带扩展名) 如果需要,任何额外的延迟,以确保图表完全呈现。