2017-07-01 13 views
1

私は単純なweb-appで写真を描く方法を探しています。基本的に私は標準的なスライドショーライブラリを使って円の画像を提出しようとしていますが、それはうまくいかず、理由もわかりません。ここでラケットを使ってWebアプリで画像を描くには?

サンプルです:

#lang web-server/insta 

(require slideshow) 

(define (start request) 
    (response/xexpr '(html 
        (body (circle 10)) 
        ) 
) 
) 

あなたは私に私が私のHTMLページで標準utilsのを使って絵を描くことができる方法のヒントを教えてもらえますか?

答えて

2

イメージのHTML IMGタグを生成し、適切な内容を提供する必要があります。一つの方法は、直接data uriソースとしてWebページでイメージソースを置くことです:

#lang web-server/insta 
(require pict 
     net/base64 
     file/convertible) 

;; pict->data-uri : Pict -> String 
(define (pict->data-uri pict) 
    (format "data:image/png;base64,~a" 
      (base64-encode (convert pict 'png-bytes)))) 

;; start : Request -> Response 
(define (start request) 
    (send/suspend/dispatch 
    (lambda (make-url) 
    (response/xexpr 
     `(html 
     (body 
     (p "hello, here's a circle:") 
     (img ([src ,(pict->data-uri (circle 10))])))))))) 

もう一つの方法は、画像ソースにその応答として画像を送信するURLを作ることです。

#lang web-server/insta 
(require pict 
     file/convertible) 

;; pict-response : Pict -> Response 
(define (pict-response pict) 
    (response/full 200 #"Ok" 
       (current-seconds) #"image/png" 
       (list) 
       (list (convert pict 'png-bytes)))) 

;; start : Request -> Response 
(define (start request) 
    (send/suspend/dispatch 
    (lambda (make-url) 
    (response/xexpr 
     `(html 
     (body 
     (p "hello, here's a circle:") 
     (img ([src ,(make-url 
         (lambda (req) 
         (pict-response (circle 10))))])))))))) 
+0

あなたの答えをありがとうが、私は画像を描画するために複数の引数の手順を使用できますか? @Dimitryの 'pict'ライブラリの' circle'関数が '2htdp/image'のものと異なっています。(円20の"ソリッド ""ブルー ") – Dimitry

+0

@ Dimitry 'pict'ライブラリを使った実線の青い円のコードは'(colorize(disk 20) "blue") 'です。あるいは、 'pict'のrequire行を' 2hdp/image'に置き換えることもできます。これは、そのライブラリのイメージもまたPNGバイトに変換できるからです。 'pict'ライブラリ関数は' 2htdp/image'イメージを引数として受け入れることができます(ただし、私が知る限り、他の方法では使用できません)ので、2つのライブラリを一緒に使用することもできます。名前の競合を処理するには、 'prefix-in'のようなものを使う必要があります。 –

+0

説明ありがとうございます。私は修正を加え、それはうまくいく – Dimitry