iOS OpenGL использует параметры для glTexImage2D, чтобы создать UIImage? - PullRequest
2 голосов
/ 11 января 2011

Я работаю над существующим кодом для проекта, которому я назначен.

У меня успешный звонок на glTexImage2D, например:
glTexImage2D(GL_TEXTURE_2D, 0, texture->format, texture->widthTexture, texture->heightTexture, 0, texture->format, texture->type, texture->data);

Я хотел бы создать изображение (предпочтительно CGImage или UIImage), используя переменные, переданные в glTexImage2D, но не знаю, возможно ли это.

Мне нужно создать много последовательных изображений (многие из них в секунду) из представления OpenGL и сохранить их для дальнейшего использования.

Могу ли я создать CGImage или UIImage, используя переменные, которые я использую в glTexImage2D?

Если я смогу, как мне это сделать?

Если нет, то почему я не могу и что вы предлагаете для моей задачи сохранения / захвата содержимого моего представления opengl много раз в секунду?

edit: я уже успешно сделал снимки, используя некоторые методы, предоставленные Apple с glReadPixels и т. Д. И т. Д. Я хочу что-то быстрее, чтобы я мог получать больше изображений в секунду.

edit: после просмотра и добавления кода от Thomson, вот изображение: resulting image from Thomson's code

изображение очень немного напоминает то, как оно должно выглядеть, за исключением дублирования ~ 5 раз по горизонтали и с некоторым случайным черным пространством внизу.

примечание: данные видео (каждый кадр) поступают через специальное сетевое соединение с iPhone. я считаю, что камера снимает каждый кадр с цветовым пространством YCbCr

редактировать: дальнейшее рассмотрение кода Томсона Я скопировал ваш новый код в свой проект и в результате получил другое изображение:

image 2

ширина: 320 высота: 240

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

редактировать: формат и тип

texture.type = GL_UNSIGNED_SHORT_5_6_5

texture.format = GL_RGB

Ответы [ 3 ]

3 голосов
/ 14 января 2011

Привет, binnyb, вот решение для создания UIImage с использованием данных, хранящихся в texture->data.v01d, безусловно, прав, что вы не получите UIImage, как он появляется в вашем кадровом буфере GL, но он получит вам изображение из данных до того, как оно пройдет через кадровый буфер.

ПоворотыВаши данные текстуры в 16-битном формате, 5 бит для красного, 6 бит для зеленого и 5 бит для синего.Я добавил код для преобразования 16-битных значений RGB в 32-битные значения RGBA перед созданием UIImage.Я с нетерпением жду возможности услышать, как это получается.

float width    = 512;
float height   = 512;
int   channels = 4;

// create a buffer for our image after converting it from 565 rgb to 8888rgba
u_int8_t* rawData = (u_int8_t*)malloc(width*height*channels);

// unpack the 5,6,5 pixel data into 24 bit RGB
for (int i=0; i<width*height; ++i) 
{
    // append two adjacent bytes in texture->data into a 16 bit int
    u_int16_t pixel16 = (texture->data[i*2] << 8) + texture->data[i*2+1];      
    // mask and shift each pixel into a single 8 bit unsigned, then normalize by 5/6 bit
    // max to 8 bit integer max.  Alpha set to 0.
    rawData[channels*i]   = ((pixel16 & 63488)       >> 11) / 31.0 * 255;
    rawData[channels*i+1] = ((pixel16 & 2016)  << 5  >> 10) / 63.0 * 255;
    rawData[channels*i+2] = ((pixel16 & 31)    << 11 >> 11) / 31.0 * 255;
    rawData[channels*4+3] = 0;
}

// same as before
int                    bitsPerComponent = 8;
int                    bitsPerPixel     = channels*bitsPerComponent;
int                    bytesPerRow      = channels*width;
CGColorSpaceRef        colorSpaceRef    = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo           bitmapInfo       = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent  = kCGRenderingIntentDefault;

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, 
                                                          rawData, 
                                                          channels*width*height,
                                                          NULL);
free( rawData );
CGImageRef        imageRef = CGImageCreate(width,
                                           height,
                                           bitsPerComponent,
                                           bitsPerPixel,
                                           bytesPerRow,
                                           colorSpaceRef,
                                           bitmapInfo,
                                           provider,NULL,NO,renderingIntent);

UIImage *newImage = [UIImage imageWithCGImage:imageRef];

Код для создания нового изображения взят из Создание UIImage из необработанных данных RGBA благодаря Rohit.Я протестировал это с нашим исходным размером изображения 320x240, преобразовав 24-битное RGB-изображение в формат 5,6,5, а затем до 32-битного.Я не тестировал его на изображении 512x512, но проблем не ожидаю.

1 голос
/ 11 января 2011

Вы можете сделать изображение из данных, которые вы отправляете в GL, но я сомневаюсь, что это действительно то, чего вы хотите достичь.

Полагаю, вам нужен вывод буфера кадров.Для этого вам нужно glReadPixels ().Не забывайте, что для большого буфера (скажем, 1024x768) считывание пикселей с GL займет считанные секунды, вы не получите больше 1 в секунду.

0 голосов
/ 11 января 2011

Вы должны иметь возможность использовать для этого инициализатор UIImage imageWithData. Все, что вам нужно, это убедиться, что данные в текстуре-> данные имеют структурированный формат, который можно узнать в конструкторе UIImage.

NSData* imageData = [NSData dataWithBytes:texture->data length:(3*texture->widthTexture*texture->heightTexture)];
UIImage* theImage = [UIImage imageWithData:imageData];

Типы, поддерживаемые imageWithData: не документированы, но вы можете создавать NSData из файлов .png, .jpg, .gif, и я предполагаю, что файлы .ppm без каких-либо затруднений. Если текстура-> данные в одном из этих двоичных форматов, я подозреваю, что вы можете запустить их, немного поэкспериментировав.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...