51097

Графические файлы формата BMP

Лабораторная работа

Информатика, кибернетика и программирование

Цель работы: Написать программу, реализующую просмотр графического файла (формат BMP). Программа должна: загружать и выводить на экран произвольный файл (с использованием файловых функций); читать все файлы с цветовой палитрой до 256 цветов (black/white,grey,16,256)...

Русский

2014-02-05

393.32 KB

4 чел.

Министерство Образования Республики Беларусь

Учреждение образования

«Брестский государственный технический университет»

Кафедра ЭВМ и С

Лабораторная работа №1

«Графические файлы формата BMP»

Выполнил:

студент 4-го курса

гр. Э-41, ФЭИС

Якубчик А.Н.

Проверил:

Кузьмицкий Н.Н.

Брест 2013

Цель работы:

Написать программу, реализующую просмотр графического файла (формат BMP).

Программа должна:

  1.  загружать и выводить на экран произвольный файл (с использованием файловых функций);
  2.  читать все файлы с цветовой палитрой до 256 цветов (black/white,grey,16,256);
  3.  выводить информацию из заголовков файла (тип. Размер, разрешение, использование сжатия, количество цветов, …), а также цветовую палитру.

Код программы:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

using System.Runtime.InteropServices;

namespace lab1

{

   public partial class Form1 : Form

   {

      //-----------------

       [DllImport("winmm.dll")]

       private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

       private string sCommand = "";

       public int k;

       public string path;

       public Color[] pixel;

       public Form1()

       {

           this.components = ((IContainer)null);

           this.path = "";

           this.k = 0;

           this.InitializeComponent();

           error = new error();

           Zooom = new Zooom();

       }

       error error;

       Zooom Zooom;

 

       private void openToolStripMenuItem_Click(object sender, EventArgs e)

       {

           this.label1.Visible = false;

           this.label2.Visible = false;

           this.label3.Visible = false;

           this.label4.Visible = false;

           this.label5.Visible = false;

           this.label7.Visible = false;

           this.label8.Visible = false;

           this.listView2.Visible = false;

           this.pictureBox1.Image = null;

           OpenFileDialog dialog = new OpenFileDialog();

           if (dialog.ShowDialog() == DialogResult.OK)

           {

               this.path = dialog.FileName;

               FileStream stream = new FileStream(this.path, FileMode.Open, FileAccess.Read); //синхроная и асинхронная запись и чтение 

               byte[] buffer = new byte[Marshal.SizeOf(typeof(BITMAPFILEHEADER))];  //выделение памяти для неуправляемого кода

               stream.Read(buffer, 0, Marshal.SizeOf(typeof(BITMAPFILEHEADER)));   //чтение байтов из потока и запись даных в заданый буфер

               GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);      //доступ к управляемому объекту из неуправляемой памяти

               BITMAPFILEHEADER bitmapfileheader = (BITMAPFILEHEADER)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BITMAPFILEHEADER)); //передача из неуправвляемого в управляемый память

               handle.Free();  

               if (bitmapfileheader.bfType == 0x4d42)

               {

                   this.k++;

               }

               else

               {

                   sCommand = "open \"" + @"D:\1.mp3" + "\" type mpegvideo alias MediaFile";

    //посылаем команду

    mciSendString(sCommand, null, 0, IntPtr.Zero);

    //команда для воспроизведения файла

    sCommand = "play MediaFile";

    //посылаем команду

    mciSendString(sCommand, null, 0, IntPtr.Zero);

    error.ShowDialog();

               }

           }

       }

       private void viewToolStripMenuItem_Click(object sender, EventArgs e)

       {

           if (this.k <= 0)

           {

               this.pictureBox1.Image = null;

           }

           else

           {

               int num8;

               int num9;

               int num10;

               int num11;

               this.label1.Visible = false;

               this.label2.Visible = false;

               this.label3.Visible = false;

               this.label4.Visible = false;

               this.label5.Visible = false;

               this.label7.Visible = false;

               this.label8.Visible = false;

               this.listView1.Visible = false;

               this.AutoScroll = false;

               char[,] chArray = new char[256, 4];  //256

               char[] chArray2 = new char[1024];//1024

               FileStream stream = new FileStream(this.path, FileMode.Open, FileAccess.Read);

               byte[] buffer1 = new byte[Marshal.SizeOf(typeof(BITMAPFILEHEADER))];

               stream.Read(buffer1, 0, Marshal.SizeOf(typeof(BITMAPFILEHEADER)));

               GCHandle handle = GCHandle.Alloc(buffer1, GCHandleType.Pinned);

               BITMAPFILEHEADER bitmapfileheader = (BITMAPFILEHEADER)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BITMAPFILEHEADER));

               handle.Free();

               int biBitCount = bitmapfileheader.biBitCount;

               this.AutoScroll = true;

               this.pictureBox1.Image = null;

               int x = 0;

               int y = 0;

               int index = 0;

               Color[] colorArray = new Color[256]; //256

               int biWidth = bitmapfileheader.biWidth;

               int biHeight = bitmapfileheader.biHeight;

               int num7 = bitmapfileheader.biWidth + (((bitmapfileheader.biWidth % 4) == 0) ? 0 : (4 - (bitmapfileheader.biWidth % 4)));

               Bitmap bitmap = new Bitmap(biWidth +2 , biHeight+2  );

               switch (bitmapfileheader.biBitCount)

               {

                   case 1:

                       {

                           index = 0;

                           while (index < (((int)1) << bitmapfileheader.biBitCount))

                           {

                               num8 = stream.ReadByte();

                               num9 = stream.ReadByte();

                               num10 = stream.ReadByte();

                               num11 = stream.ReadByte();

                               colorArray[index] = Color.FromArgb(255, num10, num9, num8);

                               index++;

                           }

                           index = 0;

                           x = 0;

                           y = biHeight;

                           int ReadInString = 0; //считано битов в строке

                           int ReadGroupByte = 0; //считано байт в группе по 4

                           for (index = 0; stream.Position < stream.Length; index += 1)

                           {

                               ReadGroupByte++;

                               if (ReadGroupByte == 4)

                                   ReadGroupByte = 0;

                               if (ReadInString == biWidth)

                               {

                                   ReadInString = 0;

                                   x = 0; y--;

                                   if (y < 0)

                                       break;

                                   index += 4 - ReadGroupByte;

                                   ReadGroupByte = 0;

                                   continue;

                               }

                               else //ещё не все биты прочтены в строке

                               {

                                   num11 = stream.ReadByte();

                                   for (int j = 0; j < 8; j++)

                                   {

                                       if (ReadInString == biWidth)

                                       {

                                           x = 0; y--;

                                           break;}

                                       

                                       int indexBit = ((num11 >> (7 - j)) &1);

                                       ReadInString++;

                                       bitmap.SetPixel(x, y, colorArray[indexBit]);

                                       x++;

                                   }

                               }

                           }

 break;

                       }

                   case 2:

                       index = 0;

                       while (index < (((int)1) << bitmapfileheader.biBitCount))

                       {

                           num8 = stream.ReadByte();

                           num9 = stream.ReadByte();

                           num10 = stream.ReadByte();

                           num11 = stream.ReadByte();

                           colorArray[index] = Color.FromArgb(0xff, num10, num9, num8);

                           index++;

                       }

                       for (index = 0; stream.Position < stream.Length; index++)

                       {

                           x = index % num7; //присвоение остатка

                           y = biHeight - (index / num7);

                           num11 = stream.ReadByte();

                           x = index % num7;

                           y = biHeight - (index / num7);

                           bitmap.SetPixel(x, y, colorArray[num11]);

                       }

                       break;

                   case 4:

                       index = 0;

                       while (index < (((int)1) << bitmapfileheader.biBitCount))

                       {

                           num8 = stream.ReadByte();

                           num9 = stream.ReadByte();

                           num10 = stream.ReadByte();

                           num11 = stream.ReadByte();

                           colorArray[index] = Color.FromArgb(0xff, num10, num9, num8);

                           index++;

                       }

                       index = 0;

                       while (stream.Position < stream.Length)

                       {

                           num11 = stream.ReadByte();

                           x = index % num7;

                           y = biHeight - (index / num7);

                           bitmap.SetPixel(x, y, colorArray[num11 >> 4]);

                           bitmap.SetPixel(x + 1, y, colorArray[num11 & 15]);

                           index += 2;

                       }

                       break;

                   case 8:

                       for (index = 0; index < (((int)1) << bitmapfileheader.biBitCount); index++)

                       {

                           num8 = stream.ReadByte();

                           num9 = stream.ReadByte();

                           num10 = stream.ReadByte();

                           num11 = stream.ReadByte();

                           colorArray[index] = Color.FromArgb(0xff, num10, num9, num8); // 0хff--255

                       }

                       index = 0;

                       while (stream.Position < stream.Length)

                       {

                           num11 = stream.ReadByte();

                           x = index % num7;

                           y = biHeight - (index / num7);

                           bitmap.SetPixel(x, y, colorArray[num11]);

                           index++;

                       }

                       break;

                   case 24:

                       while (stream.Position < stream.Length)

                       {

                           num8 = stream.ReadByte();

                           num9 = stream.ReadByte();

                           num10 = stream.ReadByte();

                           x = index % num7;

                           y = biHeight - (index / num7);

                           bitmap.SetPixel(x, y, Color.FromArgb(0xff, num10, num9, num8));

                           index++;

                       }

                       break;

               }

               this.pictureBox1.Width = bitmapfileheader.biWidth ;

               this.pictureBox1.Height = bitmapfileheader.biHeight;

               this.pictureBox1.Image = bitmap;

               bitmap.Save("1.bmp");

           }           

       }

       private void pictureBox1_Click(object sender, EventArgs e)

       {

       }

       private void infoToolStripMenuItem_Click(object sender, EventArgs e)

       {

           if (this.k <= 0)

           {

               this.label1.Visible = false;

               this.label2.Visible = false;

               this.label3.Visible = false;

               this.label4.Visible = false;

               this.label5.Visible = false;

               this.label7.Visible = false;

               this.label8.Visible = false;

               this.listView2.Visible = false;

               this.AutoScroll = false;

           }

           else

           {

               this.label1.Visible = true;

               this.label2.Visible = true;

               this.label3.Visible = true;

               this.label4.Visible = true;

               this.label5.Visible = true;

               this.label7.Visible = true;

               this.label8.Visible = true;

               this.listView2.Visible = false;

               this.AutoScroll = true;

               this.pictureBox1.Image = null;

               string[] strArray = new string[10];

               FileStream stream = new FileStream(this.path, FileMode.Open, FileAccess.Read);

               byte[] buffer = new byte[Marshal.SizeOf(typeof(BITMAPFILEHEADER))];

               stream.Read(buffer, 0, Marshal.SizeOf(typeof(BITMAPFILEHEADER)));

               GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);

               BITMAPFILEHEADER bitmapfileheader = (BITMAPFILEHEADER)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BITMAPFILEHEADER));

               handle.Free();

               if (bitmapfileheader.bfType == 19778)

               {

                   this.label8.Text = "Путь и имя файла:   " + stream.Name;

                   this.label1.Text = "Тип файла: BMP";

                   this.label2.Text = "Размер файла: " + bitmapfileheader.bfSize.ToString() + "  (байт)";

                   this.label3.Text = "Высота изображения: " + bitmapfileheader.biHeight.ToString();

                   this.label4.Text = "Ширина изображения: " + bitmapfileheader.biWidth.ToString();

                   switch (bitmapfileheader.biBitCount)

                   {

                       case 1:

                           this.label5.Text = "Количество цветов: 2";

                           break;

                       case 24:

                           this.label5.Text = "Количество цветов: палитра не используется, каждая тройка байт изображения представляет один пиксел, по байту для интенсивности синего, зелёного и красного канала соответственно";

                           break;

                       case 32:

                           if (bitmapfileheader.biCompression == 0)

                           {

                               this.label5.Text = "Количество цветов: изображение не содержит палитры";

                           }

                           else

                           {

                               this.label5.Text = "Количество цветов: Каждые четыре байта изображения представляют один пиксел, по байту для интенсивности синего, зелёного и красного канала соответственно";

                           }

                           break;

                       case 8:

                           this.label5.Text = "Количество цветов: В палитре содержится до 256 цветов, каждый байт изображения хранит индекс в палитре для одного пиксела";

                           break;

                       case 16:

                           if (bitmapfileheader.biCompression == 0)

                           {

                               this.label5.Text = "Количество цветов: изображение не содержит палитры";

                           }

                           else

                           {

                               this.label5.Text = "Количество цветов: Каждые два байта изображения хранят интенсивность красной, зелёной и синей компоненты одного пиксела";

                           }

                           break;

                   }

                   switch (bitmapfileheader.biCompression)

                   {

                       case 0:

                           this.label7.Text = "Тип сжатия: несжатое изображение ";

                           break;

                       case 1:

                           this.label7.Text = "Тип сжатия: сжатие RLE для 8-битных изображений";

                           break;

                       case 2:

                           this.label7.Text = "Тип сжатия: сжатие RLE для 4-битных изображений ";

                           break;

                       case 4:

                           this.label7.Text = "Тип сжатия: Win98/Me/2000/XP: JPEG-сжатие ";

                           break;

                       case 5:

                           this.label7.Text = "Тип сжатия: Win98/Me/2000/XP: PNG-сжатие ";

                           break;

                       case 6:

                           this.label7.Text = "Тип сжатия: WinCE: изображение не сжато, палитра содержит четыре 4-байтные маски для красной, зелёной, синей и прозрачной (альфа-канал) компонент цвета. Используется для 16- и 32-битных изображений";

                           break;

                   }

               }

           }

       }

       private void colorToolStripMenuItem_Click(object sender, EventArgs e)

       {

           if (this.k > 0)

           {

               int num2;

               int num3;

               int num4;

               int num5;

               this.label1.Visible = false;

               this.label2.Visible = false;

               this.label3.Visible = false;

               this.label4.Visible = false;

               this.label5.Visible = false;

               this.label7.Visible = false;

               this.label8.Visible = false;

               this.pictureBox1.Visible = false;

               this.listView2.Visible = true;

               this.listView2.Clear();

               string[] strArray = new string[10];

               FileStream stream = new FileStream(this.path, FileMode.Open, FileAccess.Read);

               byte[] buffer = new byte[Marshal.SizeOf(typeof(BITMAPFILEHEADER))];

               stream.Read(buffer, 0, Marshal.SizeOf(typeof(BITMAPFILEHEADER)));

               GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);

               BITMAPFILEHEADER bitmapfileheader = (BITMAPFILEHEADER)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BITMAPFILEHEADER));

               handle.Free();

               int num = 0;

               int num6 = 0;

               switch (bitmapfileheader.biBitCount)

               {

                   case 4:

                       while (stream.Position < 1078)

                       {

                           num2 = stream.ReadByte();

                           num3 = stream.ReadByte();

                           num4 = stream.ReadByte();

                           num5 = stream.ReadByte();

                           this.listView2.Items.Add(Convert.ToString(num6));

                           this.listView2.Items[num6].BackColor = Color.FromArgb(num5, num4, num3, num2);

                           num6++;

                           num++;

                       }

                       break;

                   case 8:

                       {

                          

                           while (stream.Position < 1078)

                           {

                               num2 = stream.ReadByte();

                               num3 = stream.ReadByte();

                               num4 = stream.ReadByte();

                               num5 = stream.ReadByte();

                               this.listView2.Items.Add(Convert.ToString(num6));

                               this.listView2.Items[num6].BackColor = Color.FromArgb(num5, num4, num3, num2);

                               num6++;

                               num++;

                           }

                           break;

                       }

                   case 24:

                       MessageBox.Show("Палитры нет!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Hand);

                       break;

               }

           }

       }

       private void label8_Click(object sender, EventArgs e)

       {

       }

       private void zoomToolStripMenuItem_Click(object sender, EventArgs e)

       {

           Zooom.Show();              

       }

       private void Form1_Load(object sender, EventArgs e)

       {

       }

   }

}

Пример тестирования:

  1.  вывод информации из заголовка файла:

  1.  наличие скролов, когда изображение не помещается в окне:

Вывод: освоил приемы обработки графических изображений в формате BMP.


 

А также другие работы, которые могут Вас заинтересовать

53324. Національно-визвольна війна українського народу середини ХVII ст. під проводом Б.Хмельницького 151 KB
  Навчати давати характеристику історичній постаті на прикладі Богдана Хмельницького. Зважаючи на те що до сьогодні збереглося понад півсотні портретів Хмельницького інколи важко зрозуміти якою ж насправді була зовнішність гетьмана. Однак можна стверджувати що найточніше її відтворив на своїй гравюрі гданський майстер Гондіус адже створив він її за життя Богдана Хмельницького. Запитання для учнів: Скажіть будь ласка як на вашу думку така постать могла очолити Національну визвольну війну відповідь учнів Зараз ми з вами послухаємо...
53325. Хобі. Плани на тиждень 329.5 KB
  My name is Dasha. I am 10. My hobby is drawing. It is an indoor activity. I go the art studio. I attend the art studio three times a week. I think my hobby is interesting. I can draw animals, people, trees. I am going to be an artist. I like my hobby because it is very exciting.
53326. HOBBIES 46.5 KB
  Let`s split into two groups, according to your birthdays (spring-summer, autumn-winter).The pupils whose birthdays are in spring-summer will show different hobbies to those who were born in autumn-winter. Be attentive! You are to give the names of different kinds of activities in turn. (Hobbies are written on the cards: reading, drawing, singing, dancing, cooking, knitting, fishing, writing stories, taking photographs, playing the piano).
53327. Хобі: Дозвілля 45.5 KB
  I like to read about sports and sportsmen. I am reading an interesting story about hockey now. My father likes to read about football. He has got a lot of books about that game. My sister is fond of animals. She likes to read about them. She has got books with funny stories and fables about animals. I gave her a present yesterday: a very big and interesting book about animals at the zoo. There are a lot of funny stories in it. My mother is interested in history. So she spends her free time with a book on history. So I can say reading is my familys hobby.
53328. Вечірки і свята 144 KB
  Розвиваюча: Розвивати фонематичний слух учнів, здатність до імітації, якість вимовних навичок і довготривалу, короткотривалу, слухову пам’ять, слуховий контроль, здатність самостійно планувати мовний вчинок, уяву, здатність до здогадки; вміння логічно, послідовно висловлювати думки ІМ, культуру читання.
53329. Улюблені свята 85 KB
  My name’s Tanya. I live in Ukraine. We celebrate many holidays in our country. I should say I like all of them. Celebrating is my joy. I love greeting guests at my home. I like cooking something tasty. Guests come to share the joy of the day. Sometimes we make presents or surprises for each other. It’s great. Now tell me what holidays you like to celebrate.
53330. Spring holidays 72.5 KB
  (The class is decorated. There is a big wreath of flowers on the wall, it is written - Spring is coming. There are many childrens drawings and placards about spring. On the blackboard there is a map of the travelling over the spring forest. Prince and princess come in.)
53331. Національні свята в США та в Україні 123.54 KB
  The topic of our lesson is National Holidays in Ukraine and in the USA. Holidays are special days of celebration that form an important part of every countrys culture. American and Ukrainian holidays come throughout the year and in all varieties. Today you will learn about the different types of holidays that Ukrainians and Americans celebrate.
53332. Праздники 50 KB
  New Years Day is the most favourite of all holidays in Ukraine. We give New Year presents; children receive their presents under the New Year’s Tree on the morning of the 1st of January. The main folk heroes of this holiday are Father Frost (Did Moroz) and his granddaughter Snigurochka (The Snow Girl).