首页 > 解决方案 > 如何在 const void 指针的内存偏移处设置一个值?

问题描述

我有一个从函数返回的指针

rs2::video_frame frame = frames.get_color_frame();
const void* data = frame.get_data();

知道这个指针是一个char大小为 RGB 值(即 3 s)的数组frame.get_data_size()

鉴于此,我如何修改某些像素颜色

int bpp = frame.get_bytes_per_pixel();
int width = frame.get_width();
int height = frame.get_height();

int offset = (y * width * bpp) + (x * bpp);
int r = offset;
int g = offset + 1;
int b = offset + 2;

// ?data[r] = newRed;
// ?data[g] = newGreen;
// ?data[b] = newBlue;

标签: c++pointers

解决方案


如果你有一个面向对象的方法,你会更容易:

struct Pixel {
    short red;
    short green;
    short blue;
};

让您的框架与std::vector<Pixel> pixels; 通过引用返回。std::vector<Pixel>& get_data();

pixels[y * width + x].red = newRed;
pixels[y * width + x].green = newGreen;
pixels[y * width + x].blue = newBlue;

如果你真的要一起工作,void*那么试试这个

char* data = static_cast<char*>(const_cast<void*>(dataframe.get_data()));
// Since you also const cast it becomes more and more dangerous. You really need know what you are doing.

size_t bpp = frame.get_bytes_per_pixel();
size_t width = frame.get_width();
size_t height = frame.get_height();

size_t offset = (y * width * bpp) + (x * bpp);
size_t r = offset;
size_t g = offset + 1;
size_t b = offset + 2;

*(data + r) = newRed;
*(data + g) = newGreen;
*(data + b) = newBlue;

对于批量更新,您可以使用memset.

有关详细信息,请参阅https://godbolt.org/z/xvc1xs


推荐阅读