drawBitmap() и setPixels(): какой шаг?
Может кто-нибудь объяснить мне (ASCII действительно приветствуется), что stride
аргумент выступает в Canvas.drawBitmap()
И в Bitmap.setPixels()/getPixels()
? Я понимаю, что это способ пропустить элементы в массиве цветов, но как?
4 ответа
В большинстве случаев шаг равен ширине. Шаг полезен, если вы пытаетесь скопировать / нарисовать субрегион растрового изображения. Например, если у вас есть растровое изображение 100x100 и вы хотите нарисовать верхний правый угол 50x50, вы можете использовать ширину 50px и шаг 100px.
Stride - количество байтов, используемых для хранения одной строки изображения.
Шаг может отличаться от ширины изображения.
Большинство изображений выровнены по 4 байта.
Например 24-битное (RGB) изображение шириной 50 пикселей. Общее количество требуемых байтов будет 150 (3(RGB)*50). Поскольку изображение будет выровнено на 4 байта, в этом случае требуемый байт станет 152.
Таким образом, вы увидите шаг 152, ширину 50 и выравнивание изображения 4 байта.
Я полагаю, что вопрос об Android, Java, а не Windows! В этом случае шаг не имеет ничего общего с "количеством байтов, используемых для хранения одной строки изображения", то есть с номенклатурой окон.
Прежде, чем вы поймете параметр "stride", вы должны знать, что getPixels - это функция, копирующая пиксели из исходного растрового изображения в целевой массив (который имеет тип int 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); // No.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];
Чтение в 2 строки: поместите его в пиксели [шаг +0]~ пиксели [шаг +wd-1];
чтение n-й строки: поместите его в пиксели [(n-1)* шага] ~ пиксели [(n-1)* шага +wd-1].
Это в значительной степени из getPixels.
Вот хорошее объяснение от Microsoft о том, что обычно происходит в изображениях. Таким образом, на простом английском языке он определяет, на сколько шагов компьютер будет сканировать данные изображения, пока не будет принято, что они находятся на следующей строке.
Я также считаю, что пример @Romain Guy также потребует установить x = 50 и height = 50, если я правильно понимаю.