我需要读取任意大小的图像并将它们应用于 GL 纹理。我正在尝试使用 ImageMagick 调整图像大小,以使它们适合最大 1024 维纹理。
这是我的代码:
Magick::Image image(filename);
int width = image.columns();
int height = image.rows();
cout << "Image dimensions: " << width << "x" << height << endl;
// resize it to fit a texture
while ( width>1024 || height>1024 ) {
try {
image.minify();
}
catch (exception &error) {
cout << "Error minifying: " << error.what() << " Skipping." << endl;
return;
}
width = image.columns();
height = image.rows();
cout << " -- minified to: " << width << "x" << height << endl;
}
// transform the pixels to something GL can use
Magick::Pixels view(image);
GLubyte *pixels = (GLubyte*)malloc( sizeof(GLubyte)*width*height*3 );
for ( ssize_t row=0; row<height; row++ ) {
Magick::PixelPacket *im_pixels = view.get(0,row,width,1);
for ( ssize_t col=0; col<width; col++ ) {
*(pixels+(row*width+col)*3+0) = (GLubyte)im_pixels[col].red;
*(pixels+(row*width+col)*3+1) = (GLubyte)im_pixels[col].green;
*(pixels+(row*width+col)*3+2) = (GLubyte)im_pixels[col].blue;
}
}
texPhoto = LoadTexture( pixels, width, height );
free(pixels);
LoadTexure() 的代码如下所示:
GLuint LoadTexture(GLubyte* pixels, GLuint width, GLuint height) {
GLuint textureId;
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
glGenTextures( 1, &textureId );
glBindTexture( GL_TEXTURE_2D, textureId );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, (unsigned int*)pixels );
return textureId;
}
除了应用了 image.minify() 之外,所有纹理都工作得很好。一旦缩小,像素基本上只是随机噪声。一定有其他事情发生,我不知道。我可能在 ImageMagick 文档中遗漏了一些关于在我缩小像素数据后我应该做什么来获取像素数据的内容。
调用 minify() 后如何正确获取像素数据?