Как создать изображение из неподписанного символа * - PullRequest
5 голосов
/ 29 августа 2011

Я пытаюсь создать новое изображение из необработанных данных без знака *. У меня есть биты на пиксель из сохраненных данных. Я попытался преобразовать необработанные данные в NSData, но в результате изображение было ноль,

unsigned char * bitmap = myData;

NSUInteger myImageDataLength = strlen ((const char *) bitmap);

NSData * d = [NSData dataWithBytes: длина растрового изображения: myImageDataLength];

imgView.image = [UIImage imageWithData: d];

Затем я попытался использовать контекст для создания изображения следующим образом:

CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
int width = mWidth;
int height = mHeight;
size_t bpp = mBpp;
size_t bpc = 8;
size_t bpr = (width * 4);
CGContextRef context = CGBitmapContextCreate(bitmap, width, height, 8, bpr, colorspace, kCGImageAlphaNone);
CGImageRef cgImage = nil;
if (context != nil) {
    cgImage = CGBitmapContextCreateImage (context);
    CGContextRelease(context);
}
CGColorSpaceRelease(colorspace);
UIImage *newImage = [UIImage imageWithCGImage:cgImage];

Я получаю сообщение об ошибке, подобное <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 24 bits/pixel; 3-component color space; kCGImageAlphaNone; 64 bytes/row.

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

Исходное изображение:

enter image description here

Результирующее изображение:

enter image description here

Результирующее изображение должно быть деформировано. (Деформировано так же, как fatBooth и другое приложение)

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

Следующий код создает экземпляр UIImage из необработанных данных о пикселях, предполагая, что у вас есть:

  • pixelData : необработанные данные пикселей
  • imageWidth , imageHeight : размеры изображения
  • scanWidth : количество байтов на линию сканирования
  • bytesPerPixel : количество байтов, используемых на пиксель, обычно 4

Полученный UIImage присваивается переменной uiImage.

CGDataProviderRef provider = CGDataProviderCreateWithData(
    NULL, 
    pixelData, 
    imageHeight * scanWidth, 
    NULL);

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

CGImageRef imageRef = CGImageCreate(imageWidth,
    imageHeight,
    8,
    bytesPerPixel * 8,
    scanWidth,
    colorSpaceRef,
    bitmapInfo,
    provider,
    NULL,
    NO,
    renderingIntent);

UIImage *uiImage = [UIImage imageWithCGImage:imageRef];
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpaceRef);
CGImageRelease(imageRef);
0 голосов
/ 29 августа 2011

Попробуйте: -

CGRect screenBounds = [[UIScreen mainScreen] bounds];
GLuint *buffer;
//point the buffer to memory location code that here accordingly
int backingWidth = screenBounds.size.width;
int backingHeight =screenBounds.size.height;    
NSInteger myDataLength = backingWidth * backingHeight * 4;


CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, releaseScreenshotData);
const int bitsPerComponent = 8;
const int bitsPerPixel = 4 * bitsPerComponent;
const int bytesPerRow = 4 * backingWidth;

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(backingWidth,backingHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);

 UIImage *myImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
 [uiimageviewobject setImage:myImage];
 [self addSubview:uiimageviewobject];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...