51149

Изучение представления графической информации в WINDOWS

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

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

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

Русский

2014-02-06

129.3 KB

2 чел.

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ

БРЕСТСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА ЭВМ и С

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

“Изучение представления графической информации в WINDOWS

Выполнил:

Студент группы Э-42

Карпеш М.П.

Проверил:

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

Брест 2013

Цель работы: Написать программу, реализующую просмотр графического файла (формат BMP). Программа должна:

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

КОД ПРОГРАММЫ:

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

 

       }

 

 

       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 == 19778){

                   this.k++;                              

               }

 

               }

           }

       }

       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[] 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 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++;  }

                           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(255, num10, num9, num8);

                           index++;

                       }

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

                           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(255, 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(255, 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(255, num10, num9, num8));

                           index++;

                       }

                       break;

               }

               this.pictureBox1.Width = bitmapfileheader.biWidth;

               this.pictureBox1.Height = bitmapfileheader.biHeight;

               this.pictureBox1.Image = bitmap;

           }                        

       }

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

               }

           }

       }

   }

}

BITMAPFILEHEADER.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace lab1

{

   #region Namespace Import Declarations

   using System;

   using System.Runtime.InteropServices;

   #endregion

   [System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]

   public struct BITMAPFILEHEADER

   {

       public short bfType; // //cигнатура

       public int bfSize; //размер файла

       public short bfReserved1;  //не используется

       public short bfReserved2; //не используется

       public int bfOffBits; //Данные растового массива

       public int biSize;   //длина заголовка

       public int biWidth;//ширина

       public int biHeight; //высота

       public short biPlanes;  // Число цветовых плоскостей

       public short biBitCount;  //Количество бит на пиксель

       public int biCompression; // Метод сжатия

       public int biSizeImage; // Длина растового массива

       public int biXPelsPerMeter; // Горизонтальное разрещение

       public int biYPelsPerMeter; // Вертикальное разрешение

       public int biClrUsed; // Число цветов изображения

       public int biClrImportant; // Число основных цветов

      

            }

}

  

Вывод: Получили представление о графической информации в WINDOWS.


 

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

20232. Молекулярне розсіяння світла на флуктуаціях густини 77.5 KB
  Молекулярне розсіяння світла на флуктуаціях густини. Розсіяння світла – це зміна якоїсь характеристики потоку оптичного випромінювання світла при його взаємодії з речовиною. Розсіяння буває двох типів: молекулярне довжина розсіяного світла = довжині падаючого світла. Якщо енергія випромінювання фотона = енергії поглинутого то розсіяння св називається Релеївським або пружнім.
20233. Рівняння стану Боголюбова М.М. 52 KB
  Рівняння стану – функціональний зв’язок між параметрами що характеризують термодинамічний стан системи. Будьякі властивості речовини знаходимо з рівняння стану. Рівняння стану потрібно для розрахунку рівноважних властивостей речовин.Переходимо до недеформованої системи : рівняння Боголюбова М.
20234. Розсіяння світла в рідинах. Формула Ейнштейна – Смолуховського 90 KB
  Розсіяння світла в рідинах. Розсіяння світла – це зміна якоїсь характеристики потоку оптичного випромінювання світла при його взаємодії з речовиною. Цими характеристиками можуть бути просторовий розподіл інтенсивності частотний спектр поляризація світла. Теорію пружного розсіяння світла розробив Ейнштейн базуючись на ідеях Смолуховського.
20235. Теплопровідність газів 36.5 KB
  При теплопровідності перенос енергії відбувається в результаті безпосередньої передачі енергії від часинок що володіють більшою енергією до частинок з меншою енергією. Теплопровідність газів описується рням Фур’є: æ=–коефіцієнт теплопровідності [æ]=Вт мК [q]=дж с=Вт де λ – середня довжина вільного пробігу молекули газа дорівнює шляху що пройшла молекула за час поділеному на кількість співударів за цей час де середня швидкість теплового руху молекули густина газу – кількість теплоти що переноситься за одиницю часу...
20236. Основи методу молекулярної динаміки 104.5 KB
  Вивчається положення та швидкість різних частинок комірки. Одночасна зміна положення частинок в усіх комірках. ABCDположення частинок в різні моменти часу. Задача: зв’язати ці положення: Ейлер запропонував замінити на кут який утворює дотична KA до траєкторії руху тої частинки в т.
20237. Ефект Джоуля-Томсона 88.5 KB
  Ефект ДжоуляТомсона Ефект ДжоуляТомсона – це зміна температури газу в результаті адіабатичного дроселювання€ – постійне протікання газу під дією постійного перепаду тиску газів крізь пористу перегородку яка розміщена на шляху потоку. В дослідах Джоуля і Томсона вимірювалась температура в двох послідовних перерізах неперервного і стаціонарного потоках газу до дроселя та за ним. Дійсно при взаємному притяганні молекул внутрішня енергія газу включає як кінетичну енергію молекул так і потенціальну енергію їх взаємодії. Робота...
20238. Поширення пружних хвиль у рідинах. Залежність швидкості поширення та коефіцієнта поглинання від термодинамічних параметрів 115.5 KB
  Щоб описати розповсюдження хвилі в середовищі необхідно записати хвильове рівняння. Для цього: 1 Записати рівняння руху частинки середовища – макроскопічно малого об’єму середовища лінійні розміри об’ємчику набагато менші довжини хвилі звука; 2 Записати реологічне рівняння для середовища. 3 Підставити реологічне рівняння в рівняння руху → хвильове рівняння для данного середовища. Реологічне рівняння – це рівняння яке пов’язує тензор напруг з тензором деформацій і тензором швидкості деформацій.
20239. Міжмолекулярна взаємодія в газах та рідинах 62.5 KB
  Вона базується на припущеннях: міжмолекулярна взаємодія є слабкою – розміри частинок набагато менше за відстань між ними; адіабатичне наближення – електростатичне поле сусідньої молекули збурює енергетичні стани лише електронів; наближення мультипольного розкладу – електричні заряди в молекулі по об’єму розповсюджені нерівномірно і можуть бути вільні заряди: монополі диполі квадруполі октуполі. Енергія міжмолекулярної взаємодії – це потенціальна енергія однієї молекули в електростатичному полі другої молекули. Маємо дві молекули А і В...
20240. Розсіяння нейтронів як джерело інформації про динаміку молекул 101 KB
  Розсіяння нейтронів як джерело інформації про динаміку молекул Існує загальний метод опису динаміки речовини – просторовочасові корелятивні функції. Одним із шляхів визначення корелятивних функцій є розсіяння нейтронів. Візьмемо двічі диференційний переріз розсіяння нейтронів – кількість нейтронів що вилетять із зразка під певним кутом в елемент тілесного кута і при цьому зміна енергії нейтронів потрапляє в інтервал від до де пр – пружне нп – непружне ког – когерентне нк – некогерентне. Наслідком цього є розбиття перерізу...