6

我根据示例eample-1使用 Haskell-Chart 。Haskell-Chart 生成内容到文件

toFile def "example1_big.png" $ do
...

是否可以将图表内容生成到 ByteString 而不是文件?我在文档中找不到解决方案。

4

2 回答 2

7

不幸的是,这是不可能的直接方式。toFile调用cairo库中的函数,例如withPDFSurfacewithSVGSurface它们本身调用 cairo C 库并且只使用文件名。

您始终可以写入临时文件并读取内容,如下所示:

import System.IO.Temp  -- from the temporary package
import qualified Data.ByteString.Char8 as BS

...
bs <- withSystemTempFile "chart-XXXXXXX" $ \path _ -> do
        toFile def path $ do ...
        BS.readFile path
于 2016-09-20T12:53:56.917 回答
1

这是可能的,但仅限于较慢的 Diagrams 后端。

`

import Graphics.Rendering.Chart.State(EC, execEC)
import Graphics.Rendering.Chart.Easy
import Graphics.Rendering.Chart.Backend.Diagrams
import qualified Diagrams.Backend.SVG as DSVG
import qualified Diagrams.Prelude as D
import qualified Diagrams.TwoD as D2

toSVG :: (Default r,ToRenderable r) => EC r () -> IO String
toSVG ec = do
    fontSelector <- _fo_fonts def
    let cb = render (toRenderable (execEC ec))(_fo_size def)
    let (w, h) = (800 :: Double, 600 :: Double)
    let env = createEnv vectorAlignmentFns w h fontSelector
    let (d, a) = runBackend env cb
        opts = DSVG.SVGOptions (D2.dims2D w h) Nothing T.empty [] True
        svg = D.renderDia DSVG.SVG opts d
    return $ show svg

`

于 2018-10-27T17:33:58.257 回答