C 复制图像原始数据
每次发生更改时,我都会从一个线程获得一个指向原始图像数据的指针,我想在另一个线程使用它之前复制它。如果我不知道原始数据的大小,因为它会随机选择一个大小并给出原始数据,那么如何实现这一点?如何从该指针复制原始数据?要复制原始指针“数据”,您需要其他信息:该数据的大小。原始数据指向一个图像,因此在创建时您已经有了C 复制图像原始数据,c,image,C,Image,每次发生更改时,我都会从一个线程获得一个指向原始图像数据的指针,我想在另一个线程使用它之前复制它。如果我不知道原始数据的大小,因为它会随机选择一个大小并给出原始数据,那么如何实现这一点?如何从该指针复制原始数据?要复制原始指针“数据”,您需要其他信息:该数据的大小。原始数据指向一个图像,因此在创建时您已经有了宽度和高度;如果这不是8位/像素图像,也可能有一个bpp(每像素字节数)。将这三者相乘将得到原始数据大小 当前,您仅转发原始数据的地址。要访问其他变量,还需要转发其余变量 一个选项(根据我的
宽度
和高度
;如果这不是8位/像素图像,也可能有一个bpp
(每像素字节数)。将这三者相乘将得到原始数据大小
当前,您仅转发原始数据的地址。要访问其他变量,还需要转发其余变量
一个选项(根据我的评论)是将malloc
ed原始数据大小扩展为存储width
和height
(可选地,bpp
)所需的大小,并从一开始就存储这些数据
更好的方法(因为更易于管理)是创建一个结构
:
struct myData_t {
int width;
int height;
void *data;
} myData, *myDataPtr;
用数据填充此结构,并将其地址返回给其他函数
请记住按照正确的顺序进行内存清理:首先,释放
myDataPtr->data
,然后才释放myDataPtr
本身。如果您不知道指向多少数据,并且没有EOT标记,则无法可靠地执行此操作。指向原始数据的指针不会显示其大小。因此,解决方案很简单:您必须添加一个机制来转发大小。。。例如,将“原始数据”的大小扩展一个int,然后将大小写入这个int。那么我该怎么做呢?如果我可以计算转储图像的宽度和高度,这是制作此指针副本的可靠方法。如果您知道总字节数(我假设您可以从宽度*高度*Bpp计算),那么您可以执行简单的malloc
和memcpy
。您必须复制它吗?通常,通过将地址和指针立即由malloc重置,或者从空闲池弹出一个缓冲区或索引,将这样大的缓冲区通知给其他线程。memcpy是多余和浪费的。