5

FJCore を使用して WriteableBitmap を jpeg にエンコードする方法を見つけようとしています。WriteableBitmap が生のピクセルを提供することは理解していますが、FJCore が JpegEncoder メソッドに期待する形式に変換する方法がわかりません。JpegEncoder には 2 つのオーバーロードがあり、1 つは FluxJpeg.Core.Image を受け取り、もう 1 つは DecodedJpeg を受け取ります。

FluxJpeg.Core.Image を作成しようとしましたが、画像データに byte[][,] が必要です。byte[n][x,y] ここで、x は幅、y は高さですが、n がどうあるべきかわかりません。

n は、各ピクセルにエンコードされた argb 情報に対応するため、4 にする必要があると考えましたが、試してみると、FJCore が範囲外の引数をスローするという例外が発生しました。これが私が試したものです。Raster は私の byte[4][x,y] 配列です。

raster[0][x, y] = (byte)((pixel >> 24) & 0xFF);
raster[1][x, y] = (byte)((pixel >> 16) & 0xFF);
raster[2][x, y] = (byte)((pixel >> 8) & 0xFF);
raster[3][x, y] = (byte)(pixel & 0xFF);
4

3 に答える 3

13

理解した!code.google.com から FJCoreをダウンロードし、イメージ クラスを実行しました。RGB バイトのみが必要です。ここに私が書いた関数があります。画像の base64 バージョンが必要なので、それが関数から返されます。

    private static string GetBase64Jpg(WriteableBitmap bitmap)
    {
        int width = bitmap.PixelWidth;
        int height = bitmap.PixelHeight;
        int bands = 3;
        byte[][,] raster = new byte[bands][,];

        for (int i = 0; i < bands; i++)
        {
            raster[i] = new byte[width, height];    
        }

        for (int row = 0; row < height; row++)
        {
            for (int column = 0; column < width; column++)
            {
                int pixel = bitmap.Pixels[width * row + column];
                raster[0][column, row] = (byte)(pixel >> 16);
                raster[1][column, row] = (byte)(pixel >> 8);
                raster[2][column, row] = (byte)pixel;
            }
        }

        ColorModel model = new ColorModel { colorspace = ColorSpace.RGB };
        FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster);
        MemoryStream stream = new MemoryStream();
        JpegEncoder encoder = new JpegEncoder(img, 90, stream);
        encoder.Encode();

        stream.Seek(0, SeekOrigin.Begin);
        byte[] binaryData = new Byte[stream.Length];
        long bytesRead = stream.Read(binaryData, 0, (int)stream.Length);

        string base64String =
                System.Convert.ToBase64String(binaryData,
                                              0,
                                              binaryData.Length);

        return base64String;
    }
于 2009-07-18T02:47:37.877 に答える
2

このコードは問題なく、動作するはずです。同じコードを使用して、Web サービスを介してサーバーに画像ストリームを送信し、これらのバイトを使用して画像を再生成しています...これらのバイトを Db に保存することもできます

 [WebMethod]
 public string SaveImage(string data, string fileName)
 {
    byte[] imageBytes = System.Convert.FromBase64String(data);

    MemoryStream mem = new MemoryStream();
    mem.Write(imageBytes, 0, imageBytes.Length);

    System.Drawing.Image img = System.Drawing.Image.FromStream(mem);
    img.Save("D:\\FinalTest.jpg");      
    return "Saved !";
 }
于 2009-12-21T10:44:08.783 に答える
0

[n] は画像のバイト配列である必要があるように聞こえます。私は WriteableBitmap を JPEG にエンコードすることを検討しており、同じライブラリを見つけましたが、詳細には調べていませんが、これが当てはまると仮定して、さらに追加しますまだ試す機会がないので、後でこの回答でこれが機能するかどうかを確認してください。Silverlight で WritableBitmap のバイトを取得する方法がいくつかあると思いますが、他の型に保存することは可能だと思います。

于 2009-07-17T13:46:53.407 に答える