我从C语言开始(我通常使用Java或PHP),我的void *指针类型有问题。
在我的程序中,我从结构 f 中包含外部API的像素缓冲区。 (void *)f - > PIXBUF
该指针指向以BGR24编码的像素缓冲区。 3个字节对应一个像素(每种颜色1个字节)。
我想只保持1个八位字节(像素= 3个字节)。但我真的不知道该怎么做。我juste有所有这些八位字节的地址(f - > pixbuf)。是否可以通过逐个读取每个八位字节来填充char选项卡?
PS:f的大小 - > pixelbuf是5 292 000字节
答案 0 :(得分:2)
要通过void
- 指针访问特定数据类型,您需要将void
指针强制转换为您要访问的类型的指针,char
。
struct pic
{
void * pixbuf;
size_t pixbuflen;
...
}
...
struct pic f = ...;
struct pic grey = {0};
grey->pixbuflen = f->pixbuflen/3;
grey->pixbuf = malloc(grey->pixbuflen); /* Allocate the target buffer begin sized a
3rd of the destination buffer. */
if (NULL == grey->pixbuf) /* Test for failure. */
{
/* Failure to allocate the buffer. */
grey->pixbuflen = 0;
exit(1);
}
for (size_t i = 0, j = 0; i < grey->pixbuflen; ++i, j += 3)
{
((char *) grey->pixbuf)[i] = ((char *) f->pixbuf)[j]; /* Copy every 3rd byte from
source to destination. */
}
如果可以确保指针指向有效内存,则可以将其索引为数组。
答案 1 :(得分:0)
typedef struct pixel
{
char b;
char g;
char r;
} pixel_t;
然后您可以访问任何想要的像素颜色:
pixel_t* pixels = f->pixbuf;
pixels[42].r = 0x0F;
pixels[42].g = 0xA0;
pixels[42].b = 0xB4;
答案 2 :(得分:0)
你需要这样的东西:
int length = f->pixbuflen;
unsigned char* sourcepixels = (unsigned char*)f->pixbuf;
unsigned char* destpixels = malloc(length / 3); // length being the number of
// RGB pixels of the original image
for (int i = 0; i < length/3; i++)
destpixels[i] = sourcepixels[i*3];
这是非优化的,未经测试的非错误检查代码。