- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 vuforia 进行增强现实应用。当我检测到图像时,我可以显示或渲染 3D 对象和 UIImageView,然后我可以截取 3D 对象的屏幕截图,但我无法保存普通图像。我只是显示图像的正常 UIImageview 持有。我需要渲染 2D 图像而不是普通的 UIImageView 吗?
渲染 3D:
- (void)renderFrameQCAR
{
[self setFramebuffer];
// Clear colour and depth buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Render video background and retrieve tracking state
QCAR::State state = QCAR::Renderer::getInstance().begin();
QCAR::Renderer::getInstance().drawVideoBackground();
glEnable(GL_DEPTH_TEST);
// We must detect if background reflection is active and adjust the culling direction.
// If the reflection is active, this means the pose matrix has been reflected as well,
// therefore standard counter clockwise face culling will result in "inside out" models.
if (offTargetTrackingEnabled) {
glDisable(GL_CULL_FACE);
} else {
glEnable(GL_CULL_FACE);
}
glCullFace(GL_BACK);
if(QCAR::Renderer::getInstance().getVideoBackgroundConfig().mReflection == QCAR::VIDEO_BACKGROUND_REFLECTION_ON)
glFrontFace(GL_CW); //Front camera
else
glFrontFace(GL_CCW); //Back camera
for (int i = 0; i < state.getNumTrackableResults(); ++i) {
// Get the trackable
// _numResults = state.getNumTrackableResults();
[self performSelectorOnMainThread:@selector(DisplayPhotoButton
) withObject:nil waitUntilDone:YES];
const QCAR::TrackableResult* result = state.getTrackableResult(i);
const QCAR::Trackable& trackable = result->getTrackable();
//const QCAR::Trackable& trackable = result->getTrackable();
QCAR::Matrix44F modelViewMatrix = QCAR::Tool::convertPose2GLMatrix(result->getPose());
// OpenGL 2
QCAR::Matrix44F modelViewProjection;
if (offTargetTrackingEnabled) {
SampleApplicationUtils::rotatePoseMatrix(90, 1, 0, 0,&modelViewMatrix.data[0]);
SampleApplicationUtils::scalePoseMatrix(kObjectScaleOffTargetTracking, kObjectScaleOffTargetTracking, kObjectScaleOffTargetTracking, &modelViewMatrix.data[0]);
} else {
SampleApplicationUtils::translatePoseMatrix(0.0f, 0.0f, kObjectScaleNormal, &modelViewMatrix.data[0]);
SampleApplicationUtils::scalePoseMatrix(kObjectScaleNormal, kObjectScaleNormal, kObjectScaleNormal, &modelViewMatrix.data[0]);
}
SampleApplicationUtils::multiplyMatrix(&vapp.projectionMatrix.data[0], &modelViewMatrix.data[0], &modelViewProjection.data[0]);
glUseProgram(shaderProgramID);
if (offTargetTrackingEnabled) {
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)buildingModel.vertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)buildingModel.normals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)buildingModel.texCoords);
} else {
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)teapotVertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)teapotNormals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)teapotTexCoords);
}
glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);
// Choose the texture based on the target name
int targetIndex = 0; // "stones"
if (!strcmp(trackable.getName(), "chips"))
targetIndex = 1;
else if (!strcmp(trackable.getName(), "tarmac"))
targetIndex = 2;
glActiveTexture(GL_TEXTURE0);
if (offTargetTrackingEnabled) {
glBindTexture(GL_TEXTURE_2D, augmentationTexture[3].textureID);
} else {
glBindTexture(GL_TEXTURE_2D, augmentationTexture[targetIndex].textureID);
}
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (const GLfloat*)&modelViewProjection.data[0]);
glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/);
if (offTargetTrackingEnabled) {
glDrawArrays(GL_TRIANGLES, 0, buildingModel.numVertices);
} else {
glDrawElements(GL_TRIANGLES, NUM_TEAPOT_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*)teapotIndices);
}
SampleApplicationUtils::checkGlError("EAGLView renderFrameQCAR");
}
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glDisableVertexAttribArray(vertexHandle);
glDisableVertexAttribArray(normalHandle);
glDisableVertexAttribArray(textureCoordHandle);
QCAR::Renderer::getInstance().end();
[self presentFramebuffer];
}
当相机 View 打开时显示 UIImageView:
- (id)initWithFrame:(CGRect)frame appSession:(SampleApplicationSession *) app
{
self = [super initWithFrame:frame];
if (self) {
vapp = app;
// takePhotoFlag = NO;
// [self DisplayPhotoButton];
// Enable retina mode if available on this device
if (YES == [vapp isRetinaDisplay]) {
[self setContentScaleFactor:2.0f];
}
// Load the augmentation textures
for (int i = 0; i < NUM_AUGMENTATION_TEXTURES; ++i) {
augmentationTexture[i] = [[Texture alloc] initWithImageFile:[NSString stringWithCString:textureFilenames[i] encoding:NSASCIIStringEncoding]];
}
// Create the OpenGL ES context
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
// The EAGLContext must be set for each thread that wishes to use it.
// Set it the first time this method is called (on the main thread)
if (context != [EAGLContext currentContext]) {
[EAGLContext setCurrentContext:context];
}
// Generate the OpenGL ES texture and upload the texture data for use
// when rendering the augmentation
for (int i = 0; i < NUM_AUGMENTATION_TEXTURES; ++i) {
GLuint textureID;
glGenTextures(1, &textureID);
[augmentationTexture[i] setTextureID:textureID];
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, [augmentationTexture[i] width], [augmentationTexture[i] height], 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)[augmentationTexture[i] pngData]);
}
offTargetTrackingEnabled = NO;
[self loadBuildingsModel];
[self initShaders];
_takePhotoFlag = NO;
[self DisplayPhotoButton];
}
return self;
}
- (void)DisplayPhotoButton
{
UIImage *closeButtonImage = [UIImage imageNamed:@"back.png"];
// UIImage *closeButtonTappedImage = [UIImage imageNamed:@"button_close_pressed.png"];
CGRect aRect = CGRectMake(20,20,
closeButtonImage.size.width,
closeButtonImage.size.height);
photo = [UIButton buttonWithType:UIButtonTypeCustom];
photo.frame = aRect;
photo.userInteractionEnabled=YES;
[photo setImage:closeButtonImage forState:UIControlStateNormal];
// photo.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
[photo addTarget:self action:@selector(takePhoto) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:photo];
UIButton *arrowButton = [UIButton buttonWithType:UIButtonTypeCustom];
[arrowButton setImage:[UIImage imageNamed:@"back_btn.png"] forState:UIControlStateNormal];
// [overlayButton setFrame:CGRectMake(80, 420, 60, 30)];
[arrowButton setFrame:CGRectMake(100, 10, 40, 40)];
[arrowButton addTarget:self action:@selector(showActionSheet:forEvent:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:arrowButton];
}
OpenGL 截图:
- (UIImage*) glToUIImage
{
UIImage *outputImage = nil;
CGFloat scale = [[UIScreen mainScreen] scale];
CGRect s = CGRectMake(0, 0, 320.0f * scale, 480.0f * scale);
uint8_t *buffer = (uint8_t *) malloc(s.size.width * s.size.height * 4);
glReadPixels(0, 0, s.size.width, s.size.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
UIImage *imageFromRawData(uint8_t *data, int width, int height) {
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,data,width*height*4,NULL);
CGImageRef imageRef = CGImageCreate(width, height, 8, 32, width*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaLast, provider, NULL, NO, kCGRenderingIntentDefault);
UIImage *newImage = [UIImage imageWithCGImage:imageRef];
return newImage;
}
CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, buffer, s.size.width * s.size.height * 4, NULL);
CGImageRef iref = CGImageCreate(s.size.width, s.size.height, 8, 32, s.size.width * 4, CGColorSpaceCreateDeviceRGB(), kCGBitmapByteOrderDefault, ref, NULL, true, kCGRenderingIntentDefault);
size_t width = CGImageGetWidth(iref);
size_t height = CGImageGetHeight(iref);
size_t length = width * height * 4;
uint32_t *pixels = (uint32_t *)malloc(length);
CGContextRef context1 = CGBitmapContextCreate(pixels, width, height, 8, width * 4,
CGImageGetColorSpace(iref), kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Big);
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformMakeTranslation(0.0f, height);
transform = CGAffineTransformScale(transform, 1.0, -1.0);
CGContextConcatCTM(context1, transform);
CGContextDrawImage(context1, CGRectMake(0.0f, 0.0f, width, height), iref);
CGImageRef outputRef = CGBitmapContextCreateImage(context1);
outputImage = [UIImage imageWithCGImage: outputRef];
CGDataProviderRelease(ref);
CGImageRelease(iref);
CGContextRelease(context1);
CGImageRelease(outputRef);
free(pixels);
free(buffer);
UIImageWriteToSavedPhotosAlbum(outputImage, nil, nil, nil);
return outputImage;
}
从当前帧缓冲区保存:
- (BOOL)presentFramebuffer
{
if (_takePhotoFlag)
{
[self glToUIImage];
_takePhotoFlag = NO;
}
// setFramebuffer must have been called before presentFramebuffer, therefore
// we know the context is valid and has been set for this (render) thread
// Bind the colour render buffer and present it
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
return [context presentRenderbuffer:GL_RENDERBUFFER];
}
最佳答案
您可以拥有 openGL 屏幕截图或 UI 屏幕截图。要结合这 2 个,我建议你做两个图像。这听起来很傻,但它可能是最快、最强大的方法:
*我所说的 UI 截图是这样的:
+ (UIImage *)imageFromView:(UIView *)view {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, .0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
如果您遇到诸如看到黑色背景而不是背景图像之类的问题,则可能是在跳过或预乘 alpha channel 的管道中某处生成 CGImage
时出现问题。 (一个很常见的错误)
编辑:从读取像素 RGBA 数据获取图像:
这就是我用来从原始 RGBA 数据获取 UIImage
的方法。请注意,此过程不会处理任何方向,但您可以稍微修改它,也将方向作为参数,然后使用 imageWithCGImage:scale:orientation:
UIImage *imageFromRawData(uint8_t *data, int width, int height) {
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,data,width*height*4,NULL);
CGImageRef imageRef = CGImageCreate(width, height, 8, 32, width*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaLast, provider, NULL, NO, kCGRenderingIntentDefault);
UIImage *newImage = [UIImage imageWithCGImage:imageRef];
return newImage;
}
关于ios - 使用叠加图像 OpenGLES 保存屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23947028/
有人有 DirectDraw 叠加的工作示例(代码)吗?就像屏幕上移动的东西一样。我一直试图找到 DirectDraw 叠加用法的示例,但未能找到。 谢谢。 最佳答案 尝试其中一些: from gam
我在 JPanel 中显示缩略图。当将鼠标悬停在此类缩略图上时,我想在缩略图上方的叠加层中显示其完整版本。 使用 HTML,我只需创建一个具有适当位置和高 z-index 的 div,以便它覆盖其他所
好的,所以我想做一个覆盖屏幕。 因此,每当按键为 p 时,屏幕就会暂停并弹出一个屏幕,显示:“按‘q’退出或按‘c’继续,”类似的事情。 谁能告诉我怎么做? 最佳答案 最简单的方法是使用子模块,然后为
查看我的代码: id mapped! DisplayName (user defined) mapped! Pr
我想为 QListWidget 或 QWidget 等小部件分配背景图像。这是想法: 理想情况下,背景图像会在其小部件大小发生变化时调整大小。有什么想法如何实现它吗? 稍后编辑: 这是对话的屏幕截图,
我正在尝试设置一个授权方案,我在其中检查 1. 用户已登录 2. 用户有权访问某个对象。为此,我首先调用 maybeAuthId ,然后尝试获取当前对象,并“加入”到另一个列出权限的表。有两个级别的可
我想绘制两个系列的十个 fiddle 图,一个超过第二个: library(ggplot2) #generate some data coco1<-rnorm(10000,0,1) coco2<-c(
有谁知道如何触发在网格加载时显示的股票 jqGrid“正在加载...”叠加层?我知道我可以毫不费力地使用 jquery 插件,但我希望能够使我的应用程序的外观与 jqGrid 中已经使用的外观保持一致
我正在尝试在我的谷歌地图上实现“负”覆盖,类似于您在estately.com上获得的效果。基本上,我已经根据收集的 KML 数据成功绘制了 map 多边形。当有多个路径时,它们绘制得很好。 因此,对我
您好,我正在制作一个 Android 应用程序,它使用地理位置/Google map ,除了选项卡主机之外, map /应用程序上没有任何按钮。所以我需要它,所以如果用户点击 1500 毫秒,就会出现
我正在尝试叠加两个不同的 map ,但我无法叠加它们,并且我不知道如何解决此问题。 let bottom_left = ol.proj.fromLonLat([5.00975294202035
jquery 不是最好的,有人可以建议一个通用的方法来实现我想要实现的目标吗?我有一个照片网格,当它们被点击时,一个不透明的覆盖层将在整个图片之上动画化,覆盖层将包含一些动态设置的文本。我有图像和 o
我想问一下如何为我的 android 应用程序添加不同的叠加层?因为我已经有一个扩展 Overlay 的覆盖类,它根据 KML 文件中的某些点绘制多段线。现在我想创建另一个叠加层,使用 GPS 在用户
我目前正在使用谷歌地图并且是新手..我想知道是否可以将 map 划分为具有确定高度和宽度的某些 tiles 并为它们 color ..如果是,那么有人可以解释如何去做因为我面临困难。 最佳答案 我认为
我有一个用于在我的 MapView 上绘制路径的叠加层,但我注意到它每秒被不必要地重绘大约十次。由于在 draw 方法中我绘制了路径的每一段,这很容易成为效率问题。 出于这个原因,我决定缓存叠加层的内
我是 AR 的新手。但我对我想做什么有一个大概的想法。 我想在 Android 中将 UI 元素叠加在相机输入之上。 这些 UI 元素将根据陀螺仪、gps 输入、通过蓝牙、wifi 等实时更新。 类似
我有一个带有 .xib 的 UICollectionViewCell。 这是 xib 文件的结构 您可以看到同一级别的每个元素以及 3 个 ImageView 和一个按钮。但在运行时,这些元素前面有一
我有一个关于在哪里存储 map 覆盖的大图像的问题。 图片约100MB,不能缩小或在线存储(要求)。我一直在考虑使用 Assets 目录(xcassets),但它似乎适用于在不同设备上需要调整大小的图
我的应用程序的 css 覆盖了 SmartGWT 中的一些样式并真正降低其性能。 如果我使用 css 文件运行我的应用程序,它太慢了,我什至无法将鼠标悬停在 ListGrid 小部件上。但是,如果我取
我正在制作一个网页,但遇到了问题。当屏幕为 980 像素或更小时,菜单会自行隐藏,屏幕上会出现类似“汉堡包”的按钮菜单。当您单击该按钮时,一个 div 会占据整个屏幕并显示菜单(效果很好)。但是,当您
我是一名优秀的程序员,十分优秀!