2017-09-18 6 views
0

J'utilise OpenGL pour faire partie d'une application de dessin pour iOS. Lorsque l'utilisateur a fini de dessiner, la texture est enregistrée dans un jpg en utilisant SOIL. L'image apparaît correcte dans la vue, lorsqu'elle est enregistrée, la sortie est orientée correctement (après avoir inversé l'image) mais l'image est réduite à une taille plus petite (basée sur l'appareil .. les appareils haute résolution produisent des images plus petites) que ce que j'attends.OpenGL utilisant SOIL pour produire jpg seule la taille de l'image est incorrecte

Le processus Je suivais est:

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; 

J'ai analysé l'algorithme d'inversion à mort et je suis confiant son fait son travail, sans que l'image est la même taille, mais à l'envers. Qu'est-ce qui peut causer cela? Ai-je besoin de redimensionner ma texture?

Répondre

0

Je pense que cela est lié à contentsScale de votre CAEAGLLayer (ou contentScaleFactor de votre GLKView). Vous pouvez vérifier la valeur de votre application, qui doit être 1.0, 2.0 ou 3.0. Le 1.0 nous donne une mauvaise qualité sur les écrans rétine. Lorsque nous créons des textures pour la rétine, nous devons dimensionner la taille avec contentScale de CAEAGLLayer pour les résultats attendus. Je veux dire que nous devons créer des textures de plus grande taille sinon 1.0. Je n'ai pas utilisé SOL, mais le contraire devrait être vrai. Par conséquent, je pense, pour obtenir la taille d'image que vous attendez, vous devez mettre à l'échelle vos images.

Note comme noté here, nous pouvons changer le contenu Echelle à la qualité commerciale pour la performance. Mon application OpenGL définit toujours contentScale à 2.0 même pour iphone7 + pour une meilleure performance de rendu. Donc, ne pas coder dur comme iphone7 est 2.0 ou iphone7 + est 3.0.

+0

Nous vous remercions de votre suggestion. Votre message m'a aidé à me rapprocher du problème, mais ajuster le facteur de mise à l'échelle du contenu n'est pas la solution pour moi. En augmentant le contentScalingFactor, la taille de l'image est plus proche que prévu, mais maintenant j'ai déterminé qu'il est également décentré, (0,0, w, h) coupe le bas et la gauche de l'image. Le message (https://stackoverflow.com/questions/9155515/glreadpixels-only-saves-1-4-screen-size-snapshots) peut être plus ce que je vis. Je travaille en C++ et non Obj-C et SOIL empêche de changer le type de tampon de trame à partir d'un octet non signé. – Randoramma

+0

Question rapide: Votre contenu d'origine était-il à l'échelle 1.0? – beshio

+0

Non, il a été défini automatiquement par EAGLcontext en fonction du type de périphérique. – Randoramma