cgimagecreate правильно установить bytesperrow, но интенсивность точек отличается при изменении размера изображения - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть функция ниже для создания и возврата UIImage из CGImage.imageBytes - это тип массива UInt8, содержащий 0 или 255, потому что в этом случае я хочу отобразить случайные точки серой шкалы.

- (UIImage *)imageWithBitmapBytes:(Byte *)imageBytes width:(size_t)width height:(size_t)height componentCount:(NSUInteger)componentCount {
    // bitmap size
    NSUInteger imageBufferSize = width * height * componentCount;
    // CGDataProvider create
    CGDataProviderRef dataProviderRef = CGDataProviderCreateWithData(nil, imageBytes, imageBufferSize, bufferFree);
    // 8bit
    NSUInteger bitsPerComponent = 8;
    // 24 if RGB 32 if RGBA
    NSUInteger bitsPerPixel = bitsPerComponent * componentCount;
    // bytes per row
    NSUInteger bytesPerRow = width * bitsPerPixel / 8;
    // CGImage 
    CGImageRef cgImage = CGImageRetain(CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, CGColorSpaceCreateDeviceGray(), (CGBitmapInfo)kCGImageAlphaNone, dataProviderRef, nil, false, kCGRenderingIntentDefault));

    CGDataProviderRelease(dataProviderRef);

    UIImage *image =[UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);

    return image;
}

И я создаю две растровые данные (для внешнего изображения и внутреннего изображения) с помощью этой функции

- (void)setupBitmapArrays {
    bitmapImages = [NSMutableArray array];
    insideBitmapImages = [NSMutableArray array];

    for (int i = 0; i < FRAME; i++) {
        imageBytesArray[i] = calloc(imageViewWidth * imageViewHeight * componentCount, sizeof(UInt8));
        for (int j = 0; j < imageViewWidth * imageViewHeight; j++) {
             imageBytesArray[i][j] = random();
        }
    }

    for (int i = 0; i < FRAME; i++) {
        insideImageBytesArray[i] = calloc(insideImageViewWidth * insideImageViewHeight * componentCount, sizeof(UInt8));
        for (int j = 0; j < insideImageViewWidth * insideImageViewHeight; j++) {
            insideImageBytesArray[i][j] = random();
        }
    }
}

random dot images outer and inner created by the functions above

Изображение выше содержит внешнее и внутреннее изображения (каждое слева и справа).

Внешнее и внутреннее изображениеперекрывается, но я установил белый цвет фона внутреннего изображения, чтобы не перекрывать сами точки. Но, как вы можете видеть, интенсивность точек различна, даже если отношение параметра bytesperrow к размеру изображения одинаково.Как это может произойти?

1 Ответ

0 голосов
/ 07 января 2019

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

...