首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取每个像素的PVRTC图像颜色信息

读取每个像素的PVRTC图像颜色信息
EN

Stack Overflow用户
提问于 2010-06-29 15:51:15
回答 1查看 1.3K关注 0票数 1

如何读取PVRTC图像每个像素的图像颜色信息?

下面是我提取整数数组的代码

代码语言:javascript
复制
    NSData *data = [[NSData alloc] initWithContentsOfFile:path];

 NSMutableArray *_imageData = [[NSMutableArray alloc] initWithCapacity:10];

 BOOL success = FALSE;
 PVRTexHeader *header = NULL;
 uint32_t flags, pvrTag;
 uint32_t dataLength = 0, dataOffset = 0, dataSize = 0;
 uint32_t blockSize = 0, widthBlocks = 0, heightBlocks = 0;
 uint32_t width = 0, height = 0, bpp = 4;
 uint8_t *bytes = NULL;
 uint32_t formatFlags;

 header = (PVRTexHeader *)[data bytes];

 pvrTag = CFSwapInt32LittleToHost(header->pvrTag);

 if (gPVRTexIdentifier[0] != ((pvrTag >>  0) & 0xff) ||
  gPVRTexIdentifier[1] != ((pvrTag >>  8) & 0xff) ||
  gPVRTexIdentifier[2] != ((pvrTag >> 16) & 0xff) ||
  gPVRTexIdentifier[3] != ((pvrTag >> 24) & 0xff))
 {
  return FALSE;
 }

 flags = CFSwapInt32LittleToHost(header->flags);
 formatFlags = flags & PVR_TEXTURE_FLAG_TYPE_MASK;

 if (formatFlags == kPVRTextureFlagTypePVRTC_4 || formatFlags == kPVRTextureFlagTypePVRTC_2)
 {
  [_imageData removeAllObjects];

  if (formatFlags == kPVRTextureFlagTypePVRTC_4)
   _internalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
  else if (formatFlags == kPVRTextureFlagTypePVRTC_2)
   _internalFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;


  _width = width = CFSwapInt32LittleToHost(header->width);
  _height = height = CFSwapInt32LittleToHost(header->height);

  if (CFSwapInt32LittleToHost(header->bitmaskAlpha))
   _hasAlpha = TRUE;
  else
   _hasAlpha = FALSE;

  dataLength = CFSwapInt32LittleToHost(header->dataLength);

  bytes = ((uint8_t *)[data bytes]) + sizeof(PVRTexHeader);

  // Calculate the data size for each texture level and respect the minimum number of blocks
  while (dataOffset < dataLength)
  {
   if (formatFlags == kPVRTextureFlagTypePVRTC_4)
   {
    blockSize = 4 * 4; // Pixel by pixel block size for 4bpp
    widthBlocks = width / 4;
    heightBlocks = height / 4;
    bpp = 4;
   }
   else
   {
    blockSize = 8 * 4; // Pixel by pixel block size for 2bpp
    widthBlocks = width / 8;
    heightBlocks = height / 4;
    bpp = 2;
   }

   // Clamp to minimum number of blocks
   if (widthBlocks < 2)
    widthBlocks = 2;
   if (heightBlocks < 2)
    heightBlocks = 2;

   dataSize = widthBlocks * heightBlocks * ((blockSize  * bpp) / 8);

   [_imageData addObject:[NSData dataWithBytes:bytes+dataOffset length:dataSize]];

                   for (int i=0; i < mipmapCount; i++)
                    {

              NSLog(@"width:%d, height:%d",width,height);

              data = [[NSData alloc] initWithData:[_imageData objectAtIndex:i]];
              NSLog(@"data length:%d",[data length]);

//提取了20个样本数据,但您看到的都是大整数(int i= 0;i< 20;i++){ NSLog(@"data%d:%d",i,datai);}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-06 22:40:10

PVRTC是一种4x4 (或8x4)纹理像素的基于块的压缩系统,它将周围的块考虑在内,以表示两个低频图像,高频调制数据与这两个低频图像相结合,以便产生实际的纹理像素输出。这里有一个更好的解释:

http://web.onetel.net.uk/~simonnihal/assorted3d/fenney03texcomp.pdf

因此,您提取的值实际上是编码块的一部分,这些值需要正确解码才能获得有意义的值。

有两种方法可以获得颜色信息:使用软件解压缩器解码/解压缩PVR纹理信息,或者使用POWERVR图形内核渲染纹理,然后读取结果。我在这里只讨论第一个选项。

仅从那里的信息组装一个解压缩器是相当棘手的,但幸运的是,POWERVR SDK中有C++解压缩源代码,您可以在此处获得-例如,下载其中一个iPhone SDK:

http://www.imgtec.com/powervr/insider/powervr-sdk.asp

它位于Tools/PVRTDecompress.cpp文件中。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3138805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档