Сконвертировать изображение из bmp8 в bmp 24 - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день, друзья. Нависла проблема, с которой не могу разобраться. Как указано в теме, необходимо создать некий конвертер из bmp8 в bmp24, при этом не используя стандартные средства(типа PixelFormat), а работая со структурой формата bmp.. Прошу помощи..

Решение задачи: «Сконвертировать изображение из bmp8 в bmp 24»

textual
Листинг программы
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;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
 
        FileStream f, f2;
        //byte[] buf = new byte[55];
        byte buf,buf2, buf3, buf4;
        int [] a = new int[54];
        string bfsizehex;
        string bisizehex;
        int[,] p = new int[256, 4];
        int[,] palete = new int[256, 3];
        int bfsize, bisize, nol = 0;
        int[] newz = new int[54];
        int ost24, ost8, x, y;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        /*public void HexToint(string h, float result)
        {
            int c = Convert.ToInt32(h);
            if (c > 0)
            {
                result -= 1;
            }
        }*/
 
        private void button1_Click(object sender, EventArgs e)
        {
            ost24 = 0;
            OpenFileDialog opf = new OpenFileDialog();
            if (opf.ShowDialog() == DialogResult.OK)
            {
                f = new FileStream(opf.FileName, FileMode.Open);
            }
            for (int i = 0; i < 54; i++)
            {
                buf = (byte)f.ReadByte();
                a[i] = buf;
            }
            if (a[28] != 8)
            {
                MessageBox.Show("Выбранный файл должен быть 8 бит");
                button2.Enabled = false;
            }
            else
            {
                MessageBox.Show("Выбран файл");
                button2.Enabled = true;
            }
 
            f.Position = 54;
 
            for (int k = 0; k < 256; k++)
            {
                for (int l = 0; l < 4; l++)
                {
                    buf = (byte)f.ReadByte();
                    p[k, l] = buf; 
                }
            }
            for (int m = 0; m < 256; m++)
            {
                for (int n = 0; n < 3; n++)
                {
                    palete[m, n] = p[m, n];
                }
            }
 
            string file_wight = Convert.ToString(Convert.ToInt32(Convert.ToString(a[21], 2) + Convert.ToString(a[20], 2) + Convert.ToString(a[19], 2) + Convert.ToString(a[18], 2)));
            string file_height = Convert.ToString(Convert.ToInt32(Convert.ToString(a[25], 2) + Convert.ToString(a[24], 2) + Convert.ToString(a[23], 2) + Convert.ToString(a[22], 2)));
            x = Convert.ToInt32(file_wight, 2);
            y = Convert.ToInt32(file_height, 2);
 
 
            ost24 = x * 3 % 4;
            ost8 = x % 8;
 
            if (ost24 != 0)
            {
                ost24 = 4 - ost24;
            }
            if (ost8 != 0)
            {
                ost8 = 4 - ost8;
            }
 
            bfsize = (x * 3 + ost24) * y + 54;
            bfsizehex = Convert.ToString(bfsize, 2);
 
            for (int o = 0; o < 54; o++)
            {
                newz[o] = a[o];
            }
 
            newz[5] = Convert.ToInt32(bfsizehex[1] + bfsizehex[2]);
            newz[4] = Convert.ToInt32(bfsizehex[3] + bfsizehex[4]);
            newz[3] = Convert.ToInt32(bfsizehex[5] + bfsizehex[6]);
            newz[2] = Convert.ToInt32(bfsizehex[7] + bfsizehex[8]);
            newz[13]=0;//Вписываем в заголовок новое смещение
            newz[12]=0;
            newz[11]=0;
            newz[10]=54;
            newz[29]=0; //Вписываем в заголовок новую глубину
            newz[28]=24;
 
            bisize = bfsize - 54;
            bisizehex = Convert.ToString(bisize, 2);
 
            if (ost24 != 0)
            {
                newz[37] = Convert.ToInt32(bisizehex[1] + bisizehex[2]);
                newz[36] = Convert.ToInt32(bisizehex[3] + bisizehex[4]);
                newz[35] = Convert.ToInt32(bisizehex[5] + bisizehex[6]);
                newz[34] = Convert.ToInt32(bisizehex[7] + bisizehex[8]);
            }
            else
            {
                newz[37] = 0;
                newz[36] = 0;
                newz[35] = 0;
                newz[34] = 0;
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            int s;
            SaveFileDialog save = new SaveFileDialog();
            save.Filter = "BMP(*.bmp)|*.bmp";
            if (save.ShowDialog() == DialogResult.OK)
            {
                f2 = new FileStream(save.FileName, FileMode.Create);
            }
 
            buf2 = 0;
            s = 0;
 
            while (s != 54)
            {
                buf2 = (byte)newz[s];
                f2.WriteByte(buf2);
                s += 1;
            }
            f.Position = 1078;
            f2.Position = 54;
 
            for (int i = 0; i <= y; i++)
            {
                double a = (i / y) * 100;
                progressBar1.Value = (int)Math.Round(a);
                f.Position = (x + ost8) * (i - 1) + 1078;
                for (int j = 0; j < x; j++)
                {
                    buf3 = (byte)f.ReadByte();
                    for (int k = 0; k < 3; k++)
                    {
                        buf4 = (byte)palete[buf3, k];
                        f2.WriteByte(buf4);
                    }
                    if (j == x && ost24 != 0)
                    {
                        for (int l = 0; l <= ost24; l++)
                        {
                            f2.WriteByte((byte)nol);
                        }
                    }
                }
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы