c # - X битовый процессор не работает - PullRequest
1 голос
/ 13 апреля 2011

Я недавно работал над процессором изображений и решил взглянуть на старый формат файла XBitmap (XBM).Я работаю в C #, чтобы скопировать данные пикселей из этих файлов в растровое изображение.Мне удалось настроить и алгоритм, который, кажется, работает в теории, но не отображается правильно.Для тех, кто не знает, XBM - это файл ACSII C, который содержит массив байтов и отображает монохромные данные.Ниже приведен мой алгоритм, поэтому, если кто-нибудь сможет указать мне правильное направление, я буду очень счастлив.

Извините, это немного дословно, но это весь декодер:

        string input = File.ReadAllText(fname);

        using (StreamReader r = new StreamReader(fname))
        {
            int i = input.IndexOf('{');

            string bytes = input.Substring(i+1);
            int j = bytes.IndexOf('}');
            bytes = bytes.Remove(j-1);
            string[] StringArray = bytes.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);

            byte[] pixels = new byte[StringArray.Length];

            for (int k = 0; k < StringArray.Length; k++)
            {
                byte result;
                StringArray[k] = StringArray[k].Replace("0x", "");
                StringArray[k] = StringArray[k].Replace("\r", "");
                StringArray[k] = StringArray[k].Replace("\n", "");
                StringArray[k] = StringArray[k].Trim();

                bool result1 = byte.TryParse(StringArray[k], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out result);

                if (result1)
                    pixels[k] = result;

                else
                    throw new Exception();
            }

            xBits = System.Runtime.InteropServices.Marshal.AllocHGlobal(pixels.Length);
            System.Runtime.InteropServices.Marshal.Copy(pixels, 0, xBits, pixels.Length);
        }

        return xBits;

1 Ответ

3 голосов
/ 13 апреля 2011

Я не пробовал ваш код, но вот рабочий пример, который я выкинул.Он не анализирует файл, а использует байтовый массив (из Википедии).Он также создает растровое изображение с использованием обычных вызовов GDI +.

        //Sample data from http://en.wikipedia.org/wiki/X_BitMap
        int Width = 16;
        int Height = 7;
        byte[] test_bits = { 0x13, 0x0, 0x15, 0x0, 0x93, 0xcd, 0x55, 0xa5, 0x93, 0xc5, 0x0, 0x80, 0x0, 0x60 };


        //Create our bitmap
        using (Bitmap B = new Bitmap(Width, Height))
        {
            //Will hold our byte as a string of bits
            string Bits = null;

            //Current X,Y of the painting process
            int X = 0;
            int Y = 0;

            //Loop through all of the bits
            for (int i = 0; i < test_bits.Length; i++)
            {
                //Convert the current byte to a string of bits and pad with extra 0's if needed
                Bits = Convert.ToString(test_bits[i], 2).PadLeft(8, '0');

                //Bits are stored with the first pixel in the least signigicant bit so we need to work the string from right to left
                for (int j = 7; j >=0; j--)
                {
                    //Set the pixel's color based on whether the current bit is a 0 or 1
                    B.SetPixel(X, Y, Bits[j] == '0' ? Color.White : Color.Black);
                    //Incremement our X position
                    X += 1;
                }
                //If we're passed the right boundry, reset the X and move the Y to the next line
                if (X >= Width)
                {
                    X = 0;
                    Y += 1;
                }
            }

            //Output the bitmap to the desktop
            B.Save(System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop), "Output.bmp"), System.Drawing.Imaging.ImageFormat.Bmp);
        }
...