Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2012, 21:49   #1
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию Загрузка bmp файла

Здарасти, задали написать программу для загрузки бмп файла, пишу я на c# поэтому готовых решений найти не смог = ). Попробовал написать сам, у меня вроде бы получилось, заголовки считать мне удалось, как собственно и само изображения, сама проблема в выводе изображения(а так же возможно я немного перемудрил со смещениями) помогите мне пожалуйста.
Код:
using System;
...
using System.Windows.Forms;
namespace OpenBmp
{
    public partial class Form1 : Form
    {
        Brush brush;
        byte[] bytes;
        BITMAPFILEHEADER bmFH;
        BITMAPINFOHEADER bmIH;
        int width, height, size, n, offsetX=117,offsetY=59;
        public Form1()
        {
            InitializeComponent();
        }
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct BITMAPFILEHEADER
        {
            public Int16 bfType;
            public Int32 bfSize;
            public Int16 bfReserved1;
            public Int16 bfReserved2;
            public Int32 bfOffBits;
        };
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct BITMAPINFOHEADER
        {
            public Int32 biSize;
            public Int32 biWidth;
            public Int32 biHeight;
            public Int16 biPlanes;
            public Int16 biBitCount;
            public Int32 biCompression;
            public Int32 biSizeImage;
            public Int32 biXPelsPerMeter;
            public Int32 biYPelsPerMeter;
            public Int32 biClrUsed;
            public Int32 biClrImportant; 
        };
        public T ReadStruct<T>(FileStream fs)
        {
            byte[] buffer = new byte[Marshal.SizeOf(typeof(T))];
            fs.Read(buffer, 0, Marshal.SizeOf(typeof(T)));
            GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
            T temp = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
            handle.Free();
            return temp;
        }
        private void Image_Paint(object sender, PaintEventArgs e)
        {
            int line, numBmpButes, temp;
            int i, ind=0;
            int ih, iw, new_ind;
            int numImgBytes;
            temp = width * 3;
            line = temp + width % 4;
            numImgBytes = (4 *( width*height));
            Int32[] imgBuf = new Int32[numImgBytes];
            numBmpButes = line * height;
            for (i = 0; i < numBmpButes; i++)
            {
                uint r,g,b;
                if (i >= temp && (i % line) >= temp)
                    continue;
                b = bytes[i];
                i++;
                g = bytes[i];
                i++;
                r = bytes[i];
                iw = ind % width;
                ih = ind / width;
                new_ind = iw + (height - ih - 1) * width;
                imgBuf[new_ind] = ((int)r | (int)g << 8 | (int)b << 16) << 8;
                ind++;
            }
            Graphics gr = e.Graphics;
            for (int y = 0, rgb=0; y < height; y++)
                for (int x = 0; x < width; x++)
                {
                    rgb++;
                    int r,g,b;
                    r=imgBuf[rgb];
                    r=r>>24;
                    g=imgBuf[rgb];
                    g=g>>16;
                    b=imgBuf[rgb];
                    b=b>>8;
                    brush = new SolidBrush(Color.FromArgb(r, g, b));
                    gr.FillRectangle(brush, x, y, 1, 1);
                }
        }
        public void Open_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream(@"C:\Users\Alek\Documents\Visual Studio 2010\Projects\OpenBmp\OpenBmp\bin\Debug\For_Test.bmp", FileMode.Open, FileAccess.Read);
            bmFH = ReadStruct<BITMAPFILEHEADER>(fs);
            bmIH = ReadStruct<BITMAPINFOHEADER>(fs);
            n = bmFH.bfSize - bmFH.bfOffBits;
            bytes = new byte[n];
            width = bmIH.biWidth;
            height = bmIH.biHeight;
            if (bmIH.biSizeImage == 0)
            {
                size = width * 3 + width % 4;
                size = size * height;
            }
            else
            {
                size = bmIH.biSizeImage;
            }
            textBox1.Text = Convert.ToString(width);
            textBox2.Text = Convert.ToString(height);
            textBox3.Text = Convert.ToString(size);
            fs.Position = bmFH.bfOffBits;
            fs.Read(bytes, 0, n);
        }
        private void Render_Click(object sender, EventArgs e)
        {
            Image.Height = height;
            Image.Width = width;
            this.Width = width + offsetX;
            this.Height = height + offsetY;
            textBox1.Text = Convert.ToString(Image.Width);
            textBox2.Text = Convert.ToString(Image.Height);
            textBox3.Text = Convert.ToString(size);
        }
    }
}
Alek-de-Mik вне форума Ответить с цитированием
Старый 04.10.2012, 08:11   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Ты мну поражаешь ) Решаешь рядовые задачи через 3 забора )
Код:
    public partial class Form1 : Form
    {

        public Bitmap bmp;  
        public Graphics gr;             
        public Form1()
        {
            InitializeComponent();
            gr = Graphics.FromHwnd(this.Handle);
            bmp = new Bitmap(@"f:\ph\item01.bmp");
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            gr.DrawImage(bmp, new Point(0, 0));
        }

    }
графикс можно и из паинтевентаргс брать, но я обычно предпочитаю не привязываться к такому. Однако, взятие хендла формы может быть с последствиями (я думаю, лучше его в определенные моменты брать заново, это я сужу по винапишному образу решения подобных задач)

Ты написал про "не нашёл готовых решений" , но конкретики твоей я не знаю, мб тебе задали написать именно загрузку битмапа по хедерам... тут я не особо могу помочь...

Кстати, зайди в темку "Передвижение объекта по клику мышью" я там тебе закинул примитивное решение. Там тоже кое-где оверхеда у тебя было. Пиши там, совместно добьём, что ты хотел там реализовать.

Последний раз редактировалось phomm; 04.10.2012 в 08:16.
phomm вне форума Ответить с цитированием
Старый 04.10.2012, 13:39   #3
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

В этой задаче, мне нужно именно загрузку битмапа по заголовкам сделать= )
Alek-de-Mik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка BMP [BeNdeR] Gamedev - cоздание игр: Unity, OpenGL, DirectX 13 20.05.2011 18:55
Загрузка форматов, отличных от bmp в HBitMap. Alex Cones Общие вопросы Delphi 8 29.01.2011 14:35
Загрузка BMP в Simple Graph и сохранение в BMP формат artemavd Общие вопросы Delphi 10 02.10.2010 14:19
Загрузка bmp в TImage на WinApi ImmortalAlexSan Win Api 2 19.07.2010 17:47
MFC Загрузка файла bmp для обработки ColdDeath Visual C++ 3 05.05.2010 19:31