Разбиваем bmp на кусочки

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Разбиваем bmp на кусочки

Сообщение Ramzes » 19.06.2008 (Чт) 17:18

в одно из омих проектов мне понадобилось разибть изображение на несколько маленьких. Я написал класс для разбивки послденего, дело на 3 минуты, однако как мне показалась, полезная штука в хозяйстве, поэтому решил выложить.
Visual Basic.Net
Код: Выделить всё
Public Class bmpParser
    Private m_images(,) As Bitmap
    Private m_bmp As Bitmap
    Private m_imgSize As Size


    ''' <summary>
    ''' Создает инстанс класса
    ''' </summary>
    ''' <param name="bmpSource">Картинка - источник</param>
    ''' <param name="DestinationImagesSize">Размер конечных картинок</param>
    ''' <param name="TransparencyKey">Прозрачный увет</param>
    Public Sub New(ByVal bmpSource As Bitmap, ByVal DestinationImagesSize As Size, ByVal TransparencyKey As Color)
        m_bmp = bmpSource
        m_imgSize = DestinationImagesSize
        m_bmp.MakeTransparent(TransparencyKey)
        parseBitmap()
    End Sub

    ''' <summary>
    ''' Возвращает коллекцию картинок
    ''' </summary>
    Public ReadOnly Property Images() As Bitmap(,)
        Get
            Return m_images
        End Get
    End Property
    ''' <summary>
    ''' Метод разбивает картинку на несколько картинок поменьше
    ''' </summary>
    Private Sub parseBitmap()
        'Высчитываем какого размера должен получиться масив, и инициализируем его
        m_images = Array.CreateInstance(GetType(Bitmap), CLng(m_bmp.Width / m_imgSize.Width), CLng(m_bmp.Height / m_imgSize.Height))
        Dim h As Integer = 0  'счетчик для массива
        Dim y As Integer
        Dim x As Integer
        For y = 0 To m_bmp.Height - 1 Step m_imgSize.Height 'В цыкле проходим от по координтае X
            Dim w As Integer = 0 'счетчик для массива
            For x = 0 To m_bmp.Width - 1 Step m_imgSize.Width 'В цыкле проходим от по координтае X
                'Прямоугольник, который будет скопирован (т.е. еще одна новая картинка)
                Dim rect As New Rectangle(x, y, m_imgSize.Width, m_imgSize.Height)
                'Собственно копирование и запись результата в ячейку массива
                m_images(w, h) = m_bmp.Clone(rect, System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
                w += 1 'увеличение счетчиков массива
            Next x
            h += 1 'увеличение счетчиков массива
        Next y
    End Sub
End Class

C#
Код: Выделить всё
    public class bmpParser
    {
        private Bitmap[,] m_images;

        private Bitmap m_bmp;
        private Size m_imgSize;

        /// <summary>
        /// Создает инстанс класса
        /// </summary>
        /// <param name="bmpSource">Картинка - источник</param>
        /// <param name="DestinationImagesSize">Размер конечных картинок</param>
        /// <param name="TransparencyKey">Прозрачный увет</param>
        public bmpParser(Bitmap bmpSource, Size DestinationImagesSize, Color TransparencyKey)
        {
            m_bmp = bmpSource;
            m_imgSize = DestinationImagesSize;
            m_bmp.MakeTransparent(TransparencyKey);
            parseBitmap();
        }

        /// <summary>
        /// Возвращает коллекцию картинок
        /// </summary>
        public Bitmap[,] Images
        {
            get
            {
                return m_images;
            }
        }

        /// <summary>
        /// Метод разбивает картинку на несколько картинок поменьше
        /// </summary>
        private void parseBitmap()
        {
            //Высчитываем какого размера должен получиться масив, и инициализируем его
            m_images = new Bitmap[m_bmp.Width / m_imgSize.Width, m_bmp.Height / m_imgSize.Height];
            int h = 0; //счетчик для массива
            for (int y = 0; y < m_bmp.Height; y += m_imgSize.Height)//В цыкле проходим от по координтае X
            {
                int w = 0; //счетчик для массива
                for (int x = 0; x < m_bmp.Width; x += m_imgSize.Width)//В цыкле проходим от по координтае X
                {
                    //Прямоугольник, который будет скопирован (т.е. еще одна новая картинка)
                    Rectangle rect = new Rectangle(x, y, m_imgSize.Width, m_imgSize.Height);
                    //Собственно копирование и запись результата в ячейку массива
                    m_images[w, h] = m_bmp.Clone(rect, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
                    w++; //увеличение счетчиков массива
                }
                h++; //увеличение счетчиков массива
            }
        }
    }


изначально писал на шарпе, потом на бейсик переводил.

использование
C#
Код: Выделить всё
        public Form1()
        {
            InitializeComponent();
            bmpParser parser = new bmpParser(testBmpParser.Properties.Resources.all, new Size(16, 16), Color.Fuchsia);
            foreach (Bitmap bmp in parser.Images)
            {
                PictureBox pictBox = new PictureBox();
                pictBox.Size = new Size(16, 16);
                pictBox.BackgroundImage = bmp;
                pictBox.BackgroundImageLayout = ImageLayout.Center;
                pnlPictures.Controls.Add(pictBox);
            }
        }


Отлов ошибок за вами, мне не нужно было :)

Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 67

    TopList