【问题标题】:OpenGL using SOIL to produce jpg only the image size is incorrectOpenGL 使用 SOIL 生成 jpg 只有图像大小不正确
【发布时间】:2017-09-18 21:26:06
【问题描述】:

我使用 OpenGL 作为 iOS 绘图应用程序的一部分。当用户完成绘制后,使用 SOIL 将纹理保存为 jpg。图像在视图中显示正确,保存时输出方向正确(反转图像后),但图像缩放到比我预期的更小的尺寸(基于设备..高分辨率设备产生更小的图像)。

我正在遵循的过程是:

unsigned char *pixels = (unsigned char*)malloc( 4* imgwidth* imgheight);
glBindTexture(GL_TEXTURE_2D, 0);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, imgwidth, imgheight);
glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 
glPixelStorei (GL_UNPACK_SKIP_ROWS, 1);
glPixelStorei (GL_UNPACK_SKIP_PIXELS, 1);
glReadPixels(0, 0, imgwidth, imgheight, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *) pixels);
invertPixels(pixels);
int result;
result = SOIL_save_image_quality(imagepath, SOIL_SAVE_TYPE_JPG, d, imgheight, 4, pixel_data, 99);
delete [] pixel;

我已经彻底分析了反演算法,并相信它可以完成工作,没有它,图像大小相同但上下颠倒。这可能是什么原因造成的?我需要重新调整我的纹理吗?

【问题讨论】:

    标签: ios opengl-es jpeg soil


    【解决方案1】:

    我认为这与您的 CAEAGLLayer 的 contentsScale(或您的 GLKView 的 contentScaleFactor)有关。您可以检查应用程序的值,它应该是 1.0、2.0 或 3.0。 1.0 在视网膜显示器上给了我们很差的质量。当我们为视网膜创建纹理时,我们需要使用 CAEAGLLayer 的 contentScale 来缩放大小以获得预期的结果。我的意思是如果不是 1.0,我们需要创建更大尺寸的纹理。我没有用过 SOIL,但应该是相反的。因此,我认为,要获得您期望的图像大小,您需要缩放图像。

    注意here,我们可以更改 contentsScale 以换取性能。我的 OpenGL 应用程序总是将 contentScale 设置为 2.0,即使对于 iphone7+ 也是如此,以获得更好的渲染性能。所以,不要像 iphone7 是 2.0 或 iphone7+ 是 3.0 那样硬编码。

    【讨论】:

    • 感谢您的建议。您的帖子帮助我更接近了这个问题,但单独调整内容比例因子并不是我的解决方案。通过增加 contentScalingFactor 图像大小更接近预期,但现在我确定它也偏离中心,(0,0,w,h) 正在切断图像的底部和左侧。帖子 (stackoverflow.com/questions/9155515/…) 可能更像是我所经历的。我正在使用 c++ 而不是 Obj-C 和 SOIL 阻止从无符号字节更改帧缓冲区类型。
    • 快速提问:您的原始内容缩放是 1.0 吗?
    • 不,它是由 EAGLcontext 根据设备类型自动设置的。
    猜你喜欢
    • 2019-08-25
    • 2023-03-15
    • 2013-02-06
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2014-06-23
    相关资源
    最近更新 更多