Сохранение 32-битного байта без знака в файловой системе

Я пытаюсь сохранить байтовый массив (изображения) в файловой системе, используя 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);
        }

С этим кодом я получаю "Параметр не действителен" при отправке данных в сервис. Так что это, очевидно, неправильный код для массива, поэтому я нажал на 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);
                }
            }
        }

Этот код записывает файл в файловую систему, но когда вы пытаетесь открыть его, он услужливо говорит: "Это неверный растровый файл или его формат в настоящее время не поддерживается.

Мы получаем byteArray от Flex, используя:

bitmapData.getPixels(0, 0, bitmapData.width, bitmapData.height);

А bitmapData поступает с камеры 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 параметра, тип:String, id:int = 0, image: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, и она действительна, и, похоже, я собираю необходимые данные, размер записанного файла составляет почти 700 КБ, но что-то не так. Если бы кто-то мог сказать мне, что не так со стороны Flex этого уравнения, я был бы всегда благодарен. У меня есть BitmapImage в списке отображения, он правильно привязан к модели, и я пробовал разные способы указывать на источник и рисовать прямоугольник.

1 ответ

Решение

Итак, @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);

Поэтому я изменил размер Rectangle во 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.

Спасибо всем за терпение.

Другие вопросы по тегам