drawBitmap () и setPixels (): какой шаг? - PullRequest
18 голосов
/ 25 января 2011

Может кто-нибудь объяснить мне (ASCII действительно приветствуется), что означает аргумент stride в Canvas.drawBitmap() и в Bitmap.setPixels()/getPixels()? Я понимаю, что это способ пропустить элементы в массиве цветов, но как?

Ответы [ 4 ]

19 голосов
/ 27 января 2011

Stride - это количество байтов, используемых для хранения одной строки изображения.

Stride может отличаться от ширины изображения.

Большинство изображений выровнены по 4 байта.* Например24-битное (RGB) изображение шириной 50 пикселей.Общее количество требуемых байтов будет 150 (3 (RGB) * 50).Поскольку изображение будет выровнено на 4 байта, в этом случае требуемый байт станет 152.

Таким образом, вы увидите шаг 152, ширину 50 и выравнивание изображения как 4 байта.

19 голосов
/ 25 января 2011

В большинстве случаев шаг равен ширине.Шаг полезен, если вы пытаетесь скопировать / нарисовать субрегион растрового изображения.Например, если у вас есть растровое изображение 100x100 и вы хотите нарисовать верхний правый угол 50x50, вы можете использовать ширину 50px и шаг 100px.

0 голосов
/ 01 августа 2018

Полагаю, вопрос касается Android, Java, а не Windows! В этом случае шаг не имеет ничего общего с «количеством байтов, используемых для хранения одной строки изображения», то есть с номенклатурой окон.

Прежде чем вы поймете параметр "stride", вам нужно знать, что getPixels - это функция, копирующая пиксели из исходного растрового изображения в целевой массив (который набирается в Pixels []).

касательно копирования, вам нужно знать, где находится источник (откуда) и где находится пункт назначения (куда) в функции,

public void getPixels (int [] пиксели, смещение int, шаг int, int x, int y, ширина int, высота int) {

throw new RuntimeException("Stub!");

}

эти 4 параметра управляют источником: int x, int y, int width, int height

эти 3 параметра управляют пунктом назначения: int [] пиксели, int offset, int stride

например. У вас есть sourceImage с шириной * высота = 100 * 100Пикселей, вы создаете destinationImage с шириной * высота = 200 * 100Пикселей, и вы делаете следующие коды,

sourceImage.getPixels (пиксели, 0, 2 * wd, 0, 0, wd, ht); // копирование №1

sourceImage.getPixels (пиксели, wd, 2 * wd, 0, 0, wd, ht); // копирование No.2

destinationImage = Bitmap.createBitmap (пиксели, 0, 2 * wd, 2 * wd, ht, Bitmap.Config.ARGB_8888); // сделать большое изображение в два раза больше исходного

Объяснение приведено ниже для № 1, копирующего getPixels,

1 чтение строки: с шириной линии = wd и поместите ее в пиксели [0] ~ пиксели [wd-1];

чтение двух строк: поместите его в пиксели [шаг + 0] ~ пиксели [шаг + wd-1];

чтение n-й строки: поместите его в пиксели [(n-1) * шага] ~ пиксели [(n-1) * шага + wd-1].

Это довольно большая часть getPixels.

0 голосов
/ 20 июня 2016

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

Я также считаю, что пример @Romain Guy также потребует установить x = 50 и height = 50, если я правильно понимаю.

...