如何合并具有特定移位(偏移)的两个位图
How to merge two bitmaps with specific shift(offset)?
假设我们有两个位图,由无符号长(64位)数组表示。我想使用特定的移位(偏移)合并这两个位图。例如,将位图1(较大)合并为位图2(较小)起始偏移量3。 偏移量 3 表示位图1 的第 3 位对应于位图2 的 0 位。通过合并,我的意思是逻辑或操作。最干净的方法是什么?
目前我已经用简单的无效的 for 循环完成了这个
const ulong BitsPerUlong = 64;
MergeAt(ulong startIndex, Bitmap bitmap2)
{
for (int i = startIndex; i < bitmap2.Capacity; i++)
{
bool newVal = bitmap2.GetAt(i) | bitmap1.GetAt(i)
bitmap2.SetAt(i, newVal)
}
}
bool GetAt(ulong index)
{
var dataOffset = BitOffsetToUlongOffset(index);
ulong mask = 0x1ul << ((int)(index % BitsPerUlong));
return (_data[dataOffset] & mask) == mask;
}
void SetAt(ulong index, bool value)
{
var dataOffset = BitOffsetToUlongOffset(index);
ulong mask = 0x1ul << ((int)(index % BitsPerUlong));
if (value)
{
_data[dataOffset] |= mask;
}
else
{
_data[dataOffset] &= ~mask;
}
}
ulong BitOffsetToUlongOffset(ulong index)
{
var dataOffset = index / BitsPerUlong;
return dataOffset;
}
(接受 C/C++/C#)。
正如您可能自己发现的那样,如果offset < BitsPerULong
,第一个块可以与:
data1[0] |= data2[0] << offset;
这留下了一些未合并data2[0]
位,但您可以通过以下方式获得这些位:
data2[0] >> (BitsPerULong - offset)
因此,i > 0
的下一个合并变为:
data1[i] |= (data2[i] << offset) | (data2[i-1] >> (BitsPerULong - offset));
您可以从中构造一个 for 循环来合并所有数据。当然,这仍然意味着 data2 中的几位会"脱落",但我认为这是您的问题描述所固有的?
如果你需要一个更通用的解决方案,其中offset
也可以大于 BitsPerULong
,这需要更多的工作。
我想你的意思是你想将较小的"合并"到较大的中。
你试过吗: 位图大 |= ( 位图小 <<3 ) ?
相关文章:
- C / C++ 移位/偏移/向左或向右移动位图?
- 如何在快板的屏幕中显示子位图的绘制?
- CreateDIBSection为同一图像返回不一致的位图位值
- C++ 位图中的 ttc 字体
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 难以从 CImageList 设置菜单项位图
- 如何将位图拉伸到父面板(wxWidgets 自定义)
- 如何使用 freetype2 访问单色位图中的像素状态
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 位图到垫子/2D 数组
- Gdiplus位图没有Alpha通道
- 如何从路径字符串加载Gdiplus::位图
- 在C++中使用Gdiplus创建透明位图
- 用C++压缩内存中的位图
- C++gdi::内存中的位图到PNG图像
- LoadImage 函数不适用于 ImageMagick 创建的位图图像
- (位图)LoadImage() 返回 NULL,GetLastError() 返回 0
- 将Qt qml文件转换为位图图像
- 如何从资源文件(.rc 文件)加载位图?