我有一个应用程序,要求用户通过Flash上传照片。 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”
}
程序总是抛出这一行,并显示消息“参数无效”
using (var i = Image.FromStream(ms, false, true))
非常感谢任何建议。
答案 0 :(得分:3)
BitmapData.getPixels()
只是每个像素的32位uint值(ARGB)的ByteArray,你确定C#Image.FromStream
能够正确处理这种格式吗?作为替代方案,您可以将图像编码为PNG或JPG字节(有几个PNG / JPG编码器,flex版本或as3corelib)
答案 1 :(得分: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]);
}
我希望这会有所帮助。