缩小后,Magick Pixel数据出现乱码

时间:2013-10-22 02:37:35

标签: c++ imagemagick opengl-es-2.0

我需要读取任意大小的图像并将它们应用于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()后正确获取像素数据?

1 个答案:

答案 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中为这些文件建立软链接。