我需要读取任意大小的图像并将它们应用于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()后正确获取像素数据?
答案 0 :(得分:0)
事实证明问题出在库中,并且与我在Raspberry Pi嵌入式系统中运行的环境有关。也许只是重新编译源代码就足够了,但就我的目的而言,我决定将量程大小减小到8位而不是Magick的默认值16.我还为我的场景选择了一些其他的配置选项。
它基本上归结为:
apt-get remove libmagick++-dev
wget http://www.imagemagick.org/download/ImageMagick.tar.gz
tar xvfz ImageMagick.tar.gz
cd IMageMagick-6.8.7-2
./configure --with-quantum-depth=8 --disable-openmp --disable-largefile --without-freetype --without-x
make
make install
然后编译反对这些库。我还需要在/usr/lib
中为这些文件建立软链接。