我在java读取一张图片,转成byte[]传给了C++,然后用这个图片数据做为纹理,可显示的结果为乱纹,大家帮忙看一下:JAVA 中图片处理/////tnImg是自己写的一类对象,可以对图片进行处进
int bitmapWidth = tnImg.getWidth();
int bitmapHeight = tnImg.getHeight();int[] argbData = new int[bitmapWidth * bitmapHeight];
tnImg.getARGB(argbData, 0, bitmapWidth, 0, 0, bitmapWidth, bitmapHeight);//把图片的数据存入argbDatabyte[] imageData = new byte[argbData.length * 4];
//下面把数据换成byte数据,按rgba的顺序,并把相素上下互换。
for (int i = bitmapHeight - 1; i >= 0; i--)
{
for (int j = 0; j < bitmapWidth; j++)
{
int srcPixelIndex = bitmapWidth * (bitmapHeight - 1 - i) + j;
int destPixelIndex = bitmapWidth * i + j;
imageData[4 * destPixelIndex + 2] = (byte) ((argbData[srcPixelIndex] & 0xFF) >> 0);
imageData[4 * destPixelIndex + 1] = (byte) ((argbData[srcPixelIndex] & 0xFF00) >> 8);
imageData[4 * destPixelIndex + 0] = (byte) ((argbData[srcPixelIndex] & 0xFF0000) >> 16);
imageData[4 * destPixelIndex + 3] = (byte) ((argbData[srcPixelIndex] & 0xFF000000) >> 24);
}
}
return imageData; //这个数组传给C++
C++代码:#define one 1.0f
typedef unsigned char byte;
float rotateQuad;
GLuint texture[1];
void *bitmapData;static GLfloat buffer[12] = {
one,one,0,
-one,one,0,
one,-one,0,
-one,-one,0,
};
static GLfloat texCoords[8] = {
0,0,0,one,one,0,one,one,
};
void Java_com_ldj_hellondk_NdkGLRenderer_onNdkSurfaceCreated (JNIEnv* env, jobject obj)
{
// 启用阴影平滑
glShadeModel(GL_SMOOTH); // 黑色背景
glClearColor(0, 0, 0, 0); // 设置深度缓存
glClearDepthf(1.0f);
// 启用深度测试
glEnable(GL_DEPTH_TEST);
// 所作深度测试的类型
glDepthFunc(GL_LEQUAL); // 告诉系统对透视进行修正
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
//允许2D贴图,纹理
glEnable(GL_TEXTURE_2D);
//IntBuffer intBuffer = IntBuffer.allocate(1);
// 创建纹理
glGenTextures(1, &texture[0]);
//glGenTextures(1, intBuffer);
//texture = intBuffer.get();
// 设置要使用的纹理
//glBindTexture(GL10.GL_TEXTURE_2D, texture);
//纹理绑定
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 179, 176, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapData);
// 线形滤波
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}void Java_com_ldj_hellondk_NdkGLRenderer_onNdkSurfaceChanged (JNIEnv* env, jobject obj, jint width, jint height)
{
//图形最终显示到屏幕的区域的位置、长和宽
glViewport (0,0,width,height);
//指定矩阵
glMatrixMode (GL_PROJECTION);
//将当前的矩阵设置为glMatrixMode指定的矩阵
glLoadIdentity ();
glOrthof (-2, 2, -2, 2, -2, 2);
}
void Java_com_ldj_hellondk_NdkGLRenderer_onNdkDrawFrame (JNIEnv* env, jobject obj)
{
//启用顶点设置功能,之后必须要关闭功能
glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_COLOR_ARRAY);
//清屏
glClearColor (0,0,1,1);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
glBindTexture(GL_TEXTURE_2D, texture[0]);///
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FIXED, 0, texCoords); glFrontFace(GL_CW);
glRotatef(rotateQuad, 1.0f, 0.0f, 0.0f);
glVertexPointer(3, GL_FLOAT, 0, buffer);
//glColorPointer(4, GL_FLOAT, 0 , colors);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
//glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices);
//关闭顶点设置功能
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState (GL_COLOR_ARRAY);
}void Java_com_ldj_hellondk_NdkGLRenderer_setBitmap (JNIEnv* env, jobject obj, jbyteArray bytes)
{
jbyte* buffer = env->GetByteArrayElements(bytes,0);
bitmapData = buffer;
}
int bitmapWidth = tnImg.getWidth();
int bitmapHeight = tnImg.getHeight();int[] argbData = new int[bitmapWidth * bitmapHeight];
tnImg.getARGB(argbData, 0, bitmapWidth, 0, 0, bitmapWidth, bitmapHeight);//把图片的数据存入argbDatabyte[] imageData = new byte[argbData.length * 4];
//下面把数据换成byte数据,按rgba的顺序,并把相素上下互换。
for (int i = bitmapHeight - 1; i >= 0; i--)
{
for (int j = 0; j < bitmapWidth; j++)
{
int srcPixelIndex = bitmapWidth * (bitmapHeight - 1 - i) + j;
int destPixelIndex = bitmapWidth * i + j;
imageData[4 * destPixelIndex + 2] = (byte) ((argbData[srcPixelIndex] & 0xFF) >> 0);
imageData[4 * destPixelIndex + 1] = (byte) ((argbData[srcPixelIndex] & 0xFF00) >> 8);
imageData[4 * destPixelIndex + 0] = (byte) ((argbData[srcPixelIndex] & 0xFF0000) >> 16);
imageData[4 * destPixelIndex + 3] = (byte) ((argbData[srcPixelIndex] & 0xFF000000) >> 24);
}
}
return imageData; //这个数组传给C++
C++代码:#define one 1.0f
typedef unsigned char byte;
float rotateQuad;
GLuint texture[1];
void *bitmapData;static GLfloat buffer[12] = {
one,one,0,
-one,one,0,
one,-one,0,
-one,-one,0,
};
static GLfloat texCoords[8] = {
0,0,0,one,one,0,one,one,
};
void Java_com_ldj_hellondk_NdkGLRenderer_onNdkSurfaceCreated (JNIEnv* env, jobject obj)
{
// 启用阴影平滑
glShadeModel(GL_SMOOTH); // 黑色背景
glClearColor(0, 0, 0, 0); // 设置深度缓存
glClearDepthf(1.0f);
// 启用深度测试
glEnable(GL_DEPTH_TEST);
// 所作深度测试的类型
glDepthFunc(GL_LEQUAL); // 告诉系统对透视进行修正
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
//允许2D贴图,纹理
glEnable(GL_TEXTURE_2D);
//IntBuffer intBuffer = IntBuffer.allocate(1);
// 创建纹理
glGenTextures(1, &texture[0]);
//glGenTextures(1, intBuffer);
//texture = intBuffer.get();
// 设置要使用的纹理
//glBindTexture(GL10.GL_TEXTURE_2D, texture);
//纹理绑定
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 179, 176, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapData);
// 线形滤波
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}void Java_com_ldj_hellondk_NdkGLRenderer_onNdkSurfaceChanged (JNIEnv* env, jobject obj, jint width, jint height)
{
//图形最终显示到屏幕的区域的位置、长和宽
glViewport (0,0,width,height);
//指定矩阵
glMatrixMode (GL_PROJECTION);
//将当前的矩阵设置为glMatrixMode指定的矩阵
glLoadIdentity ();
glOrthof (-2, 2, -2, 2, -2, 2);
}
void Java_com_ldj_hellondk_NdkGLRenderer_onNdkDrawFrame (JNIEnv* env, jobject obj)
{
//启用顶点设置功能,之后必须要关闭功能
glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_COLOR_ARRAY);
//清屏
glClearColor (0,0,1,1);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
glBindTexture(GL_TEXTURE_2D, texture[0]);///
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FIXED, 0, texCoords); glFrontFace(GL_CW);
glRotatef(rotateQuad, 1.0f, 0.0f, 0.0f);
glVertexPointer(3, GL_FLOAT, 0, buffer);
//glColorPointer(4, GL_FLOAT, 0 , colors);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
//glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices);
//关闭顶点设置功能
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState (GL_COLOR_ARRAY);
}void Java_com_ldj_hellondk_NdkGLRenderer_setBitmap (JNIEnv* env, jobject obj, jbyteArray bytes)
{
jbyte* buffer = env->GetByteArrayElements(bytes,0);
bitmapData = buffer;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货