Я хотел бы понять, как вычисляется «bytesPerRow» при создании NSBitmapImageRep (в моем случае из сопоставления массива поплавков в растровое изображение в градациях серого).Как «bytesPerRow» вычисляется из NSBitmapImageRep
Уточнение этой детали поможет мне понять, как память отображается из массива поплавков в массив байтов (0-255, unsigned char, ни один из этих массивов не показан в приведенном ниже коде).
В документации Apple говорится, что это число рассчитывается «по ширине изображения, количеству бит в выборке и, если данные находятся в сетчатой конфигурации, количество выборок на пиксель».
У меня была проблема после этого «расчета», поэтому я настраиваю простой цикл, чтобы найти результаты эмпирически. Следующий код работает просто отлично:
int Ny = 1; // Ny is arbitrary, note that BytesPerPlane is calculated as we would expect = Ny*BytesPerRow;
for (int Nx = 0; Nx<320; Nx+=64) {
// greyscale image representation:
NSBitmapImageRep *dataBitMapRep = [[NSBitmapImageRep alloc]
initWithBitmapDataPlanes: nil // allocate the pixel buffer for us
pixelsWide: Nx
pixelsHigh: Ny
bitsPerSample: 8
samplesPerPixel: 1
hasAlpha: NO
isPlanar: NO
colorSpaceName: NSCalibratedWhiteColorSpace // 0 = black, 1 = white
bytesPerRow: 0 // 0 means "you figure it out"
bitsPerPixel: 8]; // bitsPerSample must agree with samplesPerPixel
long rowBytes = [dataBitMapRep bytesPerRow];
printf("Nx = %d; bytes per row = %lu \n",Nx, rowBytes);
}
и выдает результат:
Nx = 0; bytes per row = 0
Nx = 64; bytes per row = 64
Nx = 128; bytes per row = 128
Nx = 192; bytes per row = 192
Nx = 256; bytes per row = 256
Таким образом, мы видим, что/строка байтов перескакивает с шагом 64 байта, даже если Nx постепенно увеличивается на 1 все пути до 320 (я не показывал все эти значения Nx). Заметим также, что Nx = 320 (max) произвольно для этого обсуждения.
Итак, с точки зрения выделения и сопоставления памяти для байтового массива, как «байты на строку» вычисляются из первых принципов? Является ли результат выше, поэтому данные из одной строки сканирования могут быть выровнены на границе слова «длина слова» (64 бит на моем MacBook Pro)?
Благодарим за понимание, возникшие проблемы с изображением того, как это работает.
Будьте осторожны, чтобы не путать 64 * байты * с 64 * битами *. –
Да, спасибо, я, кажется, много чего делаю. –