Windows下使用GDI+将字符串转成透明位图,方便后续贴图或者存储成png图片。以下是C++代码,使用前根据实际需求稍作改动即可.
void GDIPlusMakeARGBBitmap(HWND hwnd, const std::wstring& font_name, int font_size, const std::wstring& text)
{
assert(hwnd);
assert(::IsWindow(hwnd));
assert(!font_name.empty());
assert(font_size > 0);
assert(!text.empty());
Gdiplus::FontFamily font_family(font_name);
if (!font_family.IsAvailable())
{
return;
}
Gdiplus::Font font(&font_family, font_size, Gdiplus::FontStyleBold,
Gdiplus::Unit::UnitPoint);
if (!font.IsAvailable())
{
return;
}
Gdiplus::SolidBrush solid_brush(Gdiplus::Color(255, 0, 0));
Gdiplus::Graphics graphics(hwnd);
if (Gdiplus::Ok != graphics.GetLastStatus())
{
return;
}
graphics.SetTextRenderingHint(Gdiplus::TextRenderingHint::TextRenderingHintClearTypeGridFit);
Gdiplus::RectF bounding_box(0, 0, 0, 0);
graphics.MeasureString(text.c_str(), -1, &font, Gdiplus::PointF(0, 0), &bounding_box);
Gdiplus::SizeF text_size(0, 0);
bounding_box.GetSize(&text_size);
auto bitmap_w = static_cast<int>(std::round(text_size.Width));
auto bitmap_h = static_cast<int>(std::round(text_size.Height));
Gdiplus::Bitmap bitmap(bitmap_w, bitmap_h, PixelFormat32bppARGB);
if (Gdiplus::Ok != bitmap.GetLastStatus())
{
return;
}
Gdiplus::Graphics gs(&bitmap);
if (Gdiplus::Ok != gs.GetLastStatus())
{
return;
}
gs.DrawString(text.c_str(), -1, &font, Gdiplus::PointF(0.0, 0.0), &solid_brush);
Gdiplus::BitmapData locked_data;
if (Gdiplus::Ok == bitmap.LockBits(nullptr, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &locked_data))
{
auto bitmap_size = locked_data.Stride * locked_data.Height;
std::unique_ptr<uint8_t[]> bitmap_buffer(new (std::nothrow) uint8_t[bitmap_size]);
if (bitmap_buffer)
{
memcpy(bitmap_buffer.get(), locked_data.Scan0, bitmap_size);
}
bitmap.UnlockBits(&locked_data);
}
}
更多问题可以联系qq: 1130758427, qq群: 182979815 294891451. github