在 Haskell-Chart 中生成 ByteString
Generate ByteString in Haskell-Chart
我根据例子eample-1使用Haskell-图表。 Haskell-图表生成内容到文件
toFile def "example1_big.png" $ do
...
是否可以将图表内容生成为 ByteString 而不是文件?
我在文档中找不到解决方案。
不幸的是,这不可能是直接的方式。 toFile
calls upon functions in the cairo
library like withPDFSurface
, withSVGSurface
它们自己调用 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
这是可能的,但仅限于速度较慢的 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
`
我根据例子eample-1使用Haskell-图表。 Haskell-图表生成内容到文件
toFile def "example1_big.png" $ do
...
是否可以将图表内容生成为 ByteString 而不是文件? 我在文档中找不到解决方案。
不幸的是,这不可能是直接的方式。 toFile
calls upon functions in the cairo
library like withPDFSurface
, withSVGSurface
它们自己调用 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
这是可能的,但仅限于速度较慢的 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
`