5

nodejs と imagemagick を使用すると、画像のサイズを変更してブラウザに送信できます。

    var http = require('http'),
        spawn = require('child_process').spawn;

    http.createServer(function(req, res) {

        var image = 'test.jpg';
        var convert = spawn('convert', [image, '-resize', '100x100', '-']);

        convert.stdout.pipe(res);
        convert.stderr.pipe(process.stderr);

    }).listen(8080);

テスト イメージはファイル システムから読み取られます。テスト イメージがバイナリ文字列になるように変更したいと考えています。

var image = 'some long binray string representing an image.......';

私の計画は、バイナリ文字列を Mongodb に保存し、それらを動的に読み取ることです。

4

3 に答える 3

5

ノードモジュールnode-imagemagickを見てください。モジュールのページには、サイズを変更して画像化し、ファイルに書き込む次の例があります...

var fs = require('fs');
im.resize({
  srcData: fs.readFileSync('kittens.jpg', 'binary'),
  width:   256
}, function(err, stdout, stderr){
  if (err) throw err
  fs.writeFileSync('kittens-resized.jpg', stdout, 'binary');
  console.log('resized kittens.jpg to fit within 256x256px')
});

このコードを変更して、次のことを行うことができます...

var mime = require('mime')   // Get mime type based on file extension. use "npm install mime"
  , fs = require('fs')
  , util = require('util')
  , http = require('http')
  , im = require('imagemagick');

http.createServer(function (req, res) {
    var filePath = 'test.jpg';

    fs.stat(filePath, function (err, stat) {
        if (err) { throw err; }

        fs.readFile(filePath, 'binary', function (err, data) {
            if (err) { throw err; }

            im.resize({
                srcData: data,
                width: 256
            }, function (err, stdout, stderr) {
                if (err) { throw err; }

                res.writeHead(200, {
                    'Content-Type': mime.lookup(filePath),
                    'Content-Length': stat.size
                });

                var readStream = fs.createReadStream(filePath);

                return util.pump(readStream, res);
            });
        });
    });
}).listen(8080);

Ps。上記のコードはまだ実行していません。すぐに試してみますが、ファイルのサイズを非同期に変更してストリーミングする方法についてのアイデアが得られるはずです。

于 2012-07-22T10:24:06.027 に答える
3

spawn()ImageMagick コマンド ラインを呼び出すために使用しているためconvert、通常のアプローチは、中間ファイルを一時ディレクトリに書き込んで、使用直後またはスケジュール済み/cron ジョブとしてクリーンアップすることです。

変換するファイルを書きたくない場合は、画像を base64 でエンコードし、インライン形式を使用することをお勧めします。これは、一部の HTML メールや Web ページで画像がエンコードされる方法に似ています。

 inline:{base64_file|data:base64_data}
 Inline images let you read an image defined in a special base64 encoding.

注:渡すことができるコマンド ライン オプションのサイズには制限があります。Imagemagick のドキュメントでは 5000 バイトが推奨されています。Base64 でエンコードされた文字列は元の文字列よりも大きく (ウィキペディアでは137% 大きい大まかなガイドを示唆しています)、サムネイルを表示していない限り、非常に制限される可能性があります。

もう 1 つの ImageMagick 形式オプションはephemeralです。

 ephemeral:{image_file}
 Read and then Delete this image file.

I/O の受け渡しを完全に回避したい場合は、コマンド ライン ツールをラップするのではなく、ImageMagick や GD などの低レベル ライブラリを直接統合する Node.js モジュールが必要になります。

于 2012-07-23T01:32:40.433 に答える
0

これまでに何を試しましたか?GridFS を使用して画像データを保存し、そこからストリームとして取得できます..これは C# で..これが役立つかどうかはわかりません..

public static void UploadPhoto(string name)
{
    var server = MongoServer.Create("mongodb://localhost:27017");
    var database = server.GetDatabase("MyDB");
    string fileName = name;
    using (var fs = new FileStream(fileName, FileMode.Open))
    {
        var gridFsInfo = database.GridFS.Upload(fs, fileName);
        var fileId = gridFsInfo.Id;
        //ShowPhoto(filename);
    }
}

public static Stream ShowPhoto(string name)
{
    var server = MongoServer.Create("mongodb://localhost:27017");
    var database = server.GetDatabase("MyDB");
    var file = database.GridFS.FindOne(Query.EQ("filename",name));
    var stream = file.OpenRead())
    var bytes = new byte[stream.Length];
    stream.Read(bytes,0,(int)stream.Length);
    return stream;
}

ShowPhoto から返されたストリームを使用できるようになりました。

于 2012-07-22T10:31:10.757 に答える