将 32 位无符号字节数组保存到文件系统
Saving 32-bit Unsigned Byte Array to File System
我正在尝试使用 C# 将(图像的)字节数组保存到文件系统,但使用我尝试过的任何一种方法都无法正常工作,这里是代码示例 1:
string path = @"c:\ppd" + g.ToString() + ".jpg";
using (MemoryStream inputStream = new MemoryStream(image))
{
Image returnImage = Image.FromStream(inputStream);
returnImage.Save(path, ImageFormat.Jpeg);
}
使用此代码,我在将数据发送到服务时得到 'Parameter is not valid'。所以这显然是数组的错误代码,所以我点击 google 并想出了这个代码:
string path = @"c:\ppd\" + g.ToString() + ".jpg";
using (MemoryStream inputStream = new MemoryStream(image))
{
using (Stream file = File.Create(path))
{
byte[] buffer = new byte[8 * 1024];
int len;
while ((len = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
file.Write(buffer, 0, len);
}
}
}
此代码将文件写入文件系统,但当您尝试打开它时,它会提示“这不是有效的位图文件,或者当前不支持其格式”。
我们使用以下方法从 Flex 获取 byteArray:
bitmapData.getPixels(0, 0, bitmapData.width, bitmapData.height);
位图数据来自 Android 相机(通过 Distriqt 相机 ANE)。图像在应用程序中显示正常,但我不知道下一步该去哪里,请帮忙。
编辑:
Flex 中获取 byteArray 的代码是:
<s:BitmapImage id="bitmapImage" width="100%"
maxHeight="{this.height/2}"
source="{profileModel.captureBitmapPreview}"
/>
<s:Button click="{dispatchEvent(new PictureEvent
(PictureEvent.UPLOAD,
0, pictureModel.captureBitmapPreview.getPixels(new Rectangle(0,0,pictureModel.captureBitmapPreview.width,pictureModel.captureBitmapPreview.height))))}"/>
/* this is the alternative which still doesn't work **/
<s:Button click="{dispatchEvent(new PictureEvent
(PictureEvent.UPLOAD,
0, bitmapImage.getPixels(new Rectangle(0,0,bitmapImage.width,bitmapImage.height))))}"/>
PictureEvent 有 3 个参数,type:String,id:int = 0,image:ByteArray = null。
第二次编辑:这是创建位图数据的代码:
private function camera_capturedImageHandler(evt:CameraDataEvent):void
{
Camera.instance.setPresetMode(CameraMode.PRESET_MEDIUM);
Camera.instance.addEventListener(CameraEvent.VIDEO_FRAME, camera_videoFrameHandler, false, 0, true);
if (_captureBitmapData.width != evt.data.width || _captureBitmapData.height != evt.data.height)
{
_captureBitmapData = new BitmapData(evt.data.width, evt.data.height, false);
}
_captureBitmapData.draw(evt.data);
var tbd:BitmapData = new BitmapData(FlexGlobals.topLevelApplication.width, FlexGlobals.topLevelApplication.height, false)
tbd = applyOrientation(_bitmapData, "6");
profileModel.captureBitmapPreview.copyPixels(tbd, new Rectangle(0, ((FlexGlobals.topLevelApplication.height/2)-(FlexGlobals.topLevelApplication.height/4)), FlexGlobals.topLevelApplication.width, FlexGlobals.topLevelApplication.height/2), new Point(0, 0));
}
第三次编辑:
我做了一些测试,发现这段代码应该可以工作,它是上面第一个抛出 'Parameter is not valid'
块的变体
ImageConverter imageConverter = new ImageConverter();
Bitmap bm = (Bitmap)imageConverter.ConvertFrom(image);
if (bm != null && (bm.HorizontalResolution != (int)bm.HorizontalResolution || bm.VerticalResolution != (int)bm.VerticalResolution))
{
bm.SetResolution((int)(bm.HorizontalResolution + 0.5f),(int)(bm.VerticalResolution + 0.5f));
}
bm.Save(path, ImageFormat.Jpeg);
所以现在我确定错误出在 byteArray 上,但我真的看不出我做错了什么。我有 bitmapData 并且它是有效的,看起来我正在收集我需要的数据,写入的文件大小将近 700Kb,但出了点问题。
如果有人能告诉我这个等式的 Flex 方面出了什么问题,我将永远感激不已。我在显示列表上有 BitmapImage,它已正确绑定到模型,并且我尝试了不同的方式来指向源并绘制矩形。
好的,@Lorek 是对的,byteArray 只包含像素数据,没有格式信息。我们不知道为什么会这样,但基于这些知识和对数据库的一点挖掘,我意识到这种情况已经存在一段时间了,我需要一个解决方案来解决它。
所以在回答这个问题时 'How do you convert pixel data from a byteArray into an image?' 我想到了这个,仍然需要一点帮助,但基本上这解决了我遇到的问题(更多在代码之后)
Bitmap bitmap = new Bitmap(150, 150, PixelFormat.Format32bppRgb);
BitmapData bmData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
IntPtr pNative = bmData.Scan0;
Marshal.Copy(image, 0, pNative, image.Length);
bitmap.UnlockBits(bmData);
bitmap.Save(path, ImageFormat.Png);
所以我更改了 Flex 中的矩形大小,这样我就知道我在使用什么,并将 btyeArray 发布到这个方法,它为我漂亮地写出了一个 PNG。
有点蓝,真的很蓝,我不太清楚为什么,看一看:
http://ec2-52-89-85-67.us-west-2.compute.amazonaws.com/imagedata/ppd/3898ae89-e4e0-4d03-97d7-dac4e3b618d5.png
它应该是黑色的:
http://ec2-52-89-85-67.us-west-2.compute.amazonaws.com/imagedata/ppd/capture.png
所以你们中的任何一个 .Net 人都知道发生了什么并且可以给我建议(我在某个地方听说我需要切换颜色的顺序所以而不是 rgb 它被切换了,但我不知道如何或为什么这将是问题)。
编辑 这是解决方案,它很慢,毫无意义,而且花费的时间太长:http://www.codeproject.com/Articles/2056/Image-Processing-for-Dummies-with-C-and-GDI-Part-3
或者,如果我们可以解决实际的 Flex 问题,那就太好了,尽管我已经放弃了 SO 对 Flex 支持有用的所有希望
谢谢大家的耐心等待。
我正在尝试使用 C# 将(图像的)字节数组保存到文件系统,但使用我尝试过的任何一种方法都无法正常工作,这里是代码示例 1:
string path = @"c:\ppd" + g.ToString() + ".jpg";
using (MemoryStream inputStream = new MemoryStream(image))
{
Image returnImage = Image.FromStream(inputStream);
returnImage.Save(path, ImageFormat.Jpeg);
}
使用此代码,我在将数据发送到服务时得到 'Parameter is not valid'。所以这显然是数组的错误代码,所以我点击 google 并想出了这个代码:
string path = @"c:\ppd\" + g.ToString() + ".jpg";
using (MemoryStream inputStream = new MemoryStream(image))
{
using (Stream file = File.Create(path))
{
byte[] buffer = new byte[8 * 1024];
int len;
while ((len = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
file.Write(buffer, 0, len);
}
}
}
此代码将文件写入文件系统,但当您尝试打开它时,它会提示“这不是有效的位图文件,或者当前不支持其格式”。
我们使用以下方法从 Flex 获取 byteArray:
bitmapData.getPixels(0, 0, bitmapData.width, bitmapData.height);
位图数据来自 Android 相机(通过 Distriqt 相机 ANE)。图像在应用程序中显示正常,但我不知道下一步该去哪里,请帮忙。
编辑: Flex 中获取 byteArray 的代码是:
<s:BitmapImage id="bitmapImage" width="100%"
maxHeight="{this.height/2}"
source="{profileModel.captureBitmapPreview}"
/>
<s:Button click="{dispatchEvent(new PictureEvent
(PictureEvent.UPLOAD,
0, pictureModel.captureBitmapPreview.getPixels(new Rectangle(0,0,pictureModel.captureBitmapPreview.width,pictureModel.captureBitmapPreview.height))))}"/>
/* this is the alternative which still doesn't work **/
<s:Button click="{dispatchEvent(new PictureEvent
(PictureEvent.UPLOAD,
0, bitmapImage.getPixels(new Rectangle(0,0,bitmapImage.width,bitmapImage.height))))}"/>
PictureEvent 有 3 个参数,type:String,id:int = 0,image:ByteArray = null。
第二次编辑:这是创建位图数据的代码:
private function camera_capturedImageHandler(evt:CameraDataEvent):void
{
Camera.instance.setPresetMode(CameraMode.PRESET_MEDIUM);
Camera.instance.addEventListener(CameraEvent.VIDEO_FRAME, camera_videoFrameHandler, false, 0, true);
if (_captureBitmapData.width != evt.data.width || _captureBitmapData.height != evt.data.height)
{
_captureBitmapData = new BitmapData(evt.data.width, evt.data.height, false);
}
_captureBitmapData.draw(evt.data);
var tbd:BitmapData = new BitmapData(FlexGlobals.topLevelApplication.width, FlexGlobals.topLevelApplication.height, false)
tbd = applyOrientation(_bitmapData, "6");
profileModel.captureBitmapPreview.copyPixels(tbd, new Rectangle(0, ((FlexGlobals.topLevelApplication.height/2)-(FlexGlobals.topLevelApplication.height/4)), FlexGlobals.topLevelApplication.width, FlexGlobals.topLevelApplication.height/2), new Point(0, 0));
}
第三次编辑: 我做了一些测试,发现这段代码应该可以工作,它是上面第一个抛出 'Parameter is not valid'
块的变体ImageConverter imageConverter = new ImageConverter();
Bitmap bm = (Bitmap)imageConverter.ConvertFrom(image);
if (bm != null && (bm.HorizontalResolution != (int)bm.HorizontalResolution || bm.VerticalResolution != (int)bm.VerticalResolution))
{
bm.SetResolution((int)(bm.HorizontalResolution + 0.5f),(int)(bm.VerticalResolution + 0.5f));
}
bm.Save(path, ImageFormat.Jpeg);
所以现在我确定错误出在 byteArray 上,但我真的看不出我做错了什么。我有 bitmapData 并且它是有效的,看起来我正在收集我需要的数据,写入的文件大小将近 700Kb,但出了点问题。 如果有人能告诉我这个等式的 Flex 方面出了什么问题,我将永远感激不已。我在显示列表上有 BitmapImage,它已正确绑定到模型,并且我尝试了不同的方式来指向源并绘制矩形。
好的,@Lorek 是对的,byteArray 只包含像素数据,没有格式信息。我们不知道为什么会这样,但基于这些知识和对数据库的一点挖掘,我意识到这种情况已经存在一段时间了,我需要一个解决方案来解决它。 所以在回答这个问题时 'How do you convert pixel data from a byteArray into an image?' 我想到了这个,仍然需要一点帮助,但基本上这解决了我遇到的问题(更多在代码之后)
Bitmap bitmap = new Bitmap(150, 150, PixelFormat.Format32bppRgb);
BitmapData bmData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
IntPtr pNative = bmData.Scan0;
Marshal.Copy(image, 0, pNative, image.Length);
bitmap.UnlockBits(bmData);
bitmap.Save(path, ImageFormat.Png);
所以我更改了 Flex 中的矩形大小,这样我就知道我在使用什么,并将 btyeArray 发布到这个方法,它为我漂亮地写出了一个 PNG。
有点蓝,真的很蓝,我不太清楚为什么,看一看: http://ec2-52-89-85-67.us-west-2.compute.amazonaws.com/imagedata/ppd/3898ae89-e4e0-4d03-97d7-dac4e3b618d5.png 它应该是黑色的: http://ec2-52-89-85-67.us-west-2.compute.amazonaws.com/imagedata/ppd/capture.png
所以你们中的任何一个 .Net 人都知道发生了什么并且可以给我建议(我在某个地方听说我需要切换颜色的顺序所以而不是 rgb 它被切换了,但我不知道如何或为什么这将是问题)。
编辑 这是解决方案,它很慢,毫无意义,而且花费的时间太长:http://www.codeproject.com/Articles/2056/Image-Processing-for-Dummies-with-C-and-GDI-Part-3
或者,如果我们可以解决实际的 Flex 问题,那就太好了,尽管我已经放弃了 SO 对 Flex 支持有用的所有希望
谢谢大家的耐心等待。