保存32位无符号字节数组到文件系统

本文关键字:数组 文件系统 字节数 字节 32位 无符号 保存 | 更新日期: 2023-09-27 18:16:52

我正在尝试使用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);
        }

使用这段代码,当将数据发送到服务时,我得到'参数无效'。这显然是数组的错误代码,所以我点击谷歌,得到这段代码:

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);

bitmapData来自Android相机(通过Distriqt camera 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个参数,类型:String, id:int = 0,图像:ByteArray = null。

第二次编辑:下面是创建bitmapData的代码:

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));
    }

第三编辑:我已经做了一些测试,发现这段代码应该工作,它是上面第一个块的变化,抛出'参数无效'

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,它被正确地绑定到模型上,我尝试了不同的方法来指向源并绘制矩形。

保存32位无符号字节数组到文件系统

好,所以@Lorek是对的,byteArray只包含像素数据而不包含格式信息。我们不知道为什么会出现这种情况,但基于这些知识和对数据库的一点点挖掘,我意识到这种情况已经存在一段时间了,我需要一个解决方案来解决它。在回答"如何将像素数据从byteArray转换为图像"这个问题时我想出了这个,仍然需要一点帮助,但基本上这解决了我所拥有的问题(代码后更多)

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. - 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支持有用的所有希望

感谢大家的耐心等待。