作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在相机应用程序中,位图像素阵列是从流式相机中检索的。
通过将像素数组写入命名管道来捕获像素数组,在管道的另一端,ffmpeg 检索它们并创建一个 AVI 文件。
我将需要创建一个自定义帧(启用自定义文本),并将其像素作为生成影片中的第一帧进行管道传输。
问题是我如何使用 TBitmap (为方便起见)
int w = 658;
int h = 492;
TBitmap* bm = new TBitmap();
bm->Width = w;
bm->Height = h;
bm->HandleType = bmDIB;
bm->PixelFormat = pf8bit;
bm->Canvas->Font->Name = "Tahoma";
bm->Canvas->Font->Size = 8;
int textY = 10;
string info("some Text");
bm->Canvas->TextOut(10, textY, info.c_str());
unsigned long numWritten;
WriteFile(mPipeHandle, pImage, size, &numWritten, NULL);
ByteBuffer CustomBitmap::getPixArray()
{
// --- Local variables --- //
unsigned int iInfoHeaderSize=0;
unsigned int iImageSize=0;
BITMAPINFO *pBitmapInfoHeader;
unsigned char *pBitmapImageBits;
// First we call GetDIBSizes() to determine the amount of
// memory that must be allocated before calling GetDIB()
// NB: GetDIBSizes() is a part of the VCL.
GetDIBSizes(mTheBitmap->Handle,
iInfoHeaderSize,
iImageSize);
// Next we allocate memory according to the information
// returned by GetDIBSizes()
pBitmapInfoHeader = new BITMAPINFO[iInfoHeaderSize];
pBitmapImageBits = new unsigned char[iImageSize];
// Call GetDIB() to convert a device dependent bitmap into a
// Device Independent Bitmap (a DIB).
// NB: GetDIB() is a part of the VCL.
GetDIB(mTheBitmap->Handle,
mTheBitmap->Palette,
pBitmapInfoHeader,
pBitmapImageBits);
delete []pBitmapInfoHeader;
ByteBuffer buf;
buf.buffer = pBitmapImageBits;
buf.size = iImageSize;
return buf;
}
最佳答案
TBitmap
有一个 PixelFormat
属性来设置位深度。TBitmap
有一个 HandleType
属性来控制是创建 DDB 还是 DIB。 DIB 是默认值。
由于您在不同系统之间传递 BMP,因此您确实应该使用 DIB 而不是 DDB,以避免像素数据的任何损坏/误解。
另外,这行代码:
Image1->Picture->Bitmap->Handle = bm->Handle;
Image1->Picture->Bitmap->Assign(bm);
// or:
// Image1->Picture->Bitmap = bm;
Image1->Picture->Assign(bm);
delete bm;
之后,由于
TPicture
复制输入
TBitmap
,它不具有所有权。
TBitmap::SaveToStream()
方法,保存到
TMemoryStream
.或者,如果您只想要像素数据,而不是完整的 BMP 数据(即,没有 BMP header - 请参阅
Bitmap Storage ),您可以使用 Win32
GetDiBits()
函数,它以 DIB 格式输出像素。您无法获得 DDB 像素的字节缓冲区,因为它们取决于它们被渲染到的设备。 DDB 只能在内存中与
HDC
一起使用。 s,你不能传递它们。但是,一旦有了最终设备可以将其渲染到,您就可以将 DIB 转换为 DDB。
关于c++ - 如何从 TBitmap 获取像素数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59761501/
我是一名优秀的程序员,十分优秀!