2

ユーザーにフラッシュ経由で写真をアップロードするように求めるアプリケーションがあります。次に、Flashはこの写真をバイト配列に変換します。そのコードは次のとおりです。

 var rect:Rectangle=new Rectangle(0,0,imageWidth,imageHeight);

// create BitmapData
var bmd:BitmapData=new BitmapData(imageWidth,imageHeight,true,0);
bmd.draw(myMovieClip);// get the image out of the MovieClip

// create byte array
var binaryData:ByteArray = new ByteArray();
binaryData.position=0;// start at the beginning
binaryData.writeBytes(bmd.getPixels(rect));

バイト配列が作成されると、base64でエンコードされ、.ashxハンドラーを格納するIISサーバーに送信されます。ハンドラーのProcessRequestメソッドでは、次のコードを使用してデータをファイルに書き込みます。

  try
  {
      // Convert from base64string to binary array and save
      byte[] contents = Convert.FromBase64String(encodedData); //encodedData is the Base64 encoded byte array from flash
      File.WriteAllBytes(fullPath, (byte[])contents);
      context.Response.Write("result=1");
  }
  catch (Exception ex) 
  { 
     context.Response.Write("errMsg=" + ex.Message + "&result=0"); 
  }

ここまでは順調ですね。これまでは問題ありません。

この問題は、ファイルに保存されているバイトデータを取得し、C#でサーバー側でイメージを再作成しようとした後に発生します。

私が次のことを試してみると:

try
{
    var fileBytes = File.ReadAllBytes(path);
    Bitmap bmp;
    using (var ms = new MemoryStream(fileBytes))
    {
        ms.Position = 0;
        using (var i = Image.FromStream(ms, false, true))
        {
        bmp = new Bitmap(i);
        }
    }
}
catch (Exception ex)
{
    //error: ex.Message is always “the parameter is not valid”
}

プログラムは常にこの行に「パラメータが無効です」というメッセージを表示します</p>

using (var i = Image.FromStream(ms, false, true))

アドバイスをいただければ幸いです。

4

2 に答える 2

3

BitmapData.getPixels()各ピクセルの32ビットuint値(ARGB)のByteArrayですが、C#Image.FromStreamがそのような形式を正しく処理できると確信していますか?別の方法として、画像をPNGまたはJPGバイトにエンコードすることもできます(いくつかのPNG / JPGエンコーダー、フレックスバージョンまたはas3corelibがあります)

于 2013-01-25T19:26:49.103 に答える
0

上記でfsbmainが正しいことがわかりました。Image.FromStreamからデータを取得し、そこから画像を作成する機能はありませんBitmapData.getPixels()

元の画像に戻すには、Bitmap.SetPixel()以下に示すように、ARGB値を設定するバイト配列を使用してループする必要がありました。

(高さと幅がバイト配列の前に付加されることに注意してください。そのためBuffer.BlockCopy、配列を必要な部分に分割するために使用しています)

static void Main(string[] args)
            {
                string path = @"C:\data\TUIxMTA0ODM5\imagea.b64";
                string imagepath = @"C:\data\newPic.jpg";

                try
                {
                    //get the data from the file
                    var f = File.ReadAllBytes(path);

                    //get the height and width of the image
                    var newArr = new byte[4];
                    Buffer.BlockCopy(f, 0, newArr, 0, 4);
                    var height = ReadShort(newArr, 0);
                    var width = ReadShort(newArr, 2);

                    //get the pixel data
                    var myArr = new byte[f.Length - 4];
                    Buffer.BlockCopy(f, 4, myArr, 0, f.Length - 4);

                    //create the new image
                    var bmp = new Bitmap(width, height);
                    int counter = 0;
                    for (int x = 0; x < width; x++)
                    {
                        for (int y = 0; y < height; y++)
                        {
                            bmp.SetPixel(x, y, Color.FromArgb(myArr[counter], myArr[++counter], myArr[++counter], myArr[++counter]));
                            counter++;
                        }
                    }
                    bmp.Save(imagepath, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            public static short ReadShort(byte[] buffer, int offset)
            {
                return (short)((buffer[offset + 0] << 8) + buffer[offset + 1]);
            }

これがお役に立てば幸いです。

于 2013-01-26T21:43:21.160 に答える