Способ перечисления в массив байтов пикселей значений кирпичей - PullRequest
0 голосов
/ 22 октября 2011

Извините, я понятия не имел, как установить тему, которая могла бы выразить, какая помощь мне нужна.

У меня есть массив байтов, значения для каждого пикселя из растрового изображения.Это одномерный массив слева направо.Он берет каждую строку и добавляет ее в конец индекса массива.

Я хотел бы разбить растровое изображение на 225 (= 15 * 15) частей.Каждый кирпич имеет, например, размер 34x34, а длина массива равна 260100 (= 225 * 34 * 34).Итак, как вы видите, сейчас нам понадобится 15 блоков по ширине и по высоте.

Несколько месяцев назад я использовал два цикла, начиная с 0 - 14. Я написал собственный длинный код, чтобы получить все эти блоки 34x34.Однако я не использовал ни одного массива, в котором были бы сохранены все значения.

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

Но я стою лицом к лицу с проблемой, как получить 34 элемента, затем на один ряд ниже, а другой, зная, что на 35-м уровне будет еще один кирпичик с собственным начальным значением ..

PS.отредактируйте мой пост, если что-то не так.

Мало кто может сказать «сначала сделайте свой тестовый код».Я попробовал это, но то, что я получил, было просто мусором, и я действительно не знаю, как это сделать.


Этот метод использовался, чтобы обрезать изображение в меньшие изображения, содержащие кирпичи.Но я не хочу хранить маленькие изображения кирпича.Мне нужно хранить значения в массиве байтов.

Под, есть доказательство.

private void OCropImage(int ii, int jj, int p, int p2)


   {
        ////We took letter and save value to binnary, then we search in dictionary by value
        this.rect = new Rectangle();
        this.newBitmap = new Bitmap(this.bitmap);
        for (ii = 0; ii < p; ii++)
        {
            for (jj = 0; jj < p2; jj++)
            {
                ////New bitmap
                this.newBitmap = new Bitmap(this.bitmap);

                ////Set rectangle working area with letters
                this.rect = new Rectangle(jj * this.miniszerokosc, ii * this.miniwysokosc, this.miniszerokosc, this.miniwysokosc);
                ////Cut single rectangle with letter
                this.newBitmap = this.newBitmap.Clone(this.rect, this.newBitmap.PixelFormat);
                ////Add frame to rectangle to delet bad noise
                this.OAddFrameToCropImage(this.newBitmap, this.rect.Width, this.rect.Height);
                this.frm1.SetIm3 = (System.Drawing.Image)this.newBitmap;

                ////Create image with letter which constains less background
                this.newBitmap = this.newBitmap.Clone(this.GetAreaLetter(this.newBitmap), this.newBitmap.PixelFormat);
                ////Count pixels in bitmap
                this.workingArea = this.GetBinnary(this.newBitmap);

                var keysWithMatchingValues = this.alphabetLetters.Where(x => x.Value == this.workingArea).Select(x => x.Key);
                foreach (var key in keysWithMatchingValues)
                {
                    this.chesswords += key.ToString();
                }
            }

            this.chesswords += Environment.NewLine;
            var ordered = this.alphabetLetters.OrderBy(x => x.Value);
        }
    }

PS2.извините за мой английский, пожалуйста, исправьте его, если это необходимо.

1 Ответ

0 голосов
/ 22 октября 2011

Если я вас правильно понял, то если у вас есть изображение, подобное этому

p00|p01|p02|...
---+---+-------
p10|p11|p12|...
---+---+-------
p20|p21|p22|...
---+---+---+---
...|...|...|...

Который хранится в массиве при сканировании строк слева направо, например:

p00,p01,...,p0n, p10,p11,...,p1n, p20,p21, ...

Если я правильно вас понимаю, то, что вы хотите сделать, - это взять данный прямоугольник (из определенных x и y с определенной шириной и высотой) из изображения. Вот код, чтобы сделать это, с объяснениями:

byte[] crop_area (byte[] source_image, int image_width, int image_height,
int start_x, int start_y, int result_width, int result_height)
{
    byte[] result = new byte[result_width * result_height];
    int endX = x + result_width;
    int endY = y + result_height;

    int pos = 0;

    for (int y = startY; y < endY; y++)
        for (int x = startX; x < endX; x++)
        {
            /* To get to the pixel in the row I (starting from I=1), we need
             * to skip I-1 rows. Since our y indexes start from row 0 (not 1),
             * then we don't need to subtract 1.
             *
             * So, the offset of the pixel at (x,y) is:
             *
             *     y * image_width      +        x
             * |-----------------------| |-----------------|
             *   Skip pixels of y rows    Offset inside row
             */
            result[pos] = source_image[y * image_width + x];

            /* Advance to the next pixel in the result image */
            pos++;
        }
    return result;
}

Затем, чтобы взять блок в строке I и столбце J (I, J = 0, ..., 14), выполните:

crop_area (source_image, image_width, image_height, J*image_width/15, I*image_height/15, image_width/15, image_height/15)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...