我有一个图表(位图格式),我正在尝试使用StretchBlt. 绘制到屏幕时,StretchBlt效果很好。当绘制到一个 CutePDF 打印机时,它返回 0,将最后一个错误设置为ERROR_INVALID_HANDLE,并且仍然可以工作。在 PDF995 打印机或物理 HP 打印机上绘图时,它返回 0,将最后一个错误设置为ERROR_INVALID_HANDLE,并且无法绘制任何内容。
什么会导致StretchBlt某些设备失败?我已经验证源位图是 DIB 并且目标支持StretchBlt通过调用GetDeviceCaps.
这是我的代码,以防万一它是相关的:(它是用 C++Builder 编写的,所以它使用 Delphi 的 VCL;TCanvas 包装了一个 HDC,而 TBitmap 包装了一个 HBITMAP。VCL 提供了它自己的StretchDraw函数,它不支持 HALFTONE;我得到了同样的问题。)
void PrettyStretchDraw(TCanvas *dest, const TRect& rect, TGraphic *source)
{
if (dynamic_cast<Graphics::TBitmap*>(source) && !source->Transparent) {
POINT pt;
GetBrushOrgEx(dest->Handle, &pt);
SetStretchBltMode(dest->Handle, HALFTONE);
SetBrushOrgEx(dest->Handle, pt.x, pt.y, NULL);
StretchBlt(
dest->Handle,
rect.Left,
rect.Top,
rect.Width(),
rect.Height(),
dynamic_cast<Graphics::TBitmap*>(source)->Canvas->Handle,
0,
0,
source->Width,
source->Height,
SRCCOPY);
} else …Run Code Online (Sandbox Code Playgroud) 我有一个使用大量矢量图形的Windows CE应用程序,并且在某些地方非常慢.我目前正在使用GDI通过位图进行渲染,以实现无闪烁刷新.通常情况下,我正在看一个大型3D地图的一部分.在某些设备上(例如166mhz SH4),大数据集的刷新时间为3-5秒.我的问题是这个;
有没有人对Windows Mobile与Win32的图形操作的相对速度进行任何比较.换句话说,假设我们只是在寻找GDI调用,是从适用于WinCE版本的软件的Win32版本中分析结果.
有没有人尝试在WinCE平台(C++应用程序)上进行性能分析,如果是的话,使用什么工具.
是否有人知道任何提高Windows CE绘图速度的方法.我目前正在关注FastGraph 之前的问题反馈,但这是一个稍长期的解决方案.糟糕而且全部都是这样,我正在为即将发布的版本更快地寻找更好的东西.
我目前正在使用.Net中的System.Drawing.Graphics.DrawString()方法在图像上绘制文本,然后将其保存到新文件:
// define image file paths
string sourceImagePath = HttpContext.Current.Server.MapPath("~/img/sourceImage.jpg");
string destinationImagePath = HttpContext.Current.Server.MapPath("~/img/") + "finalImage.jpg";
// create new graphic to draw to
Bitmap bm = new Bitmap(200, 200);
Graphics gr = Graphics.FromImage(bm);
// open and draw image into new graphic
System.Drawing.Image sourceImage = System.Drawing.Image.FromFile(sourceImagePath, true);
gr.DrawImage(sourceImage, 0, 0);
sourceImage.Dispose();
// write "my text" on center of image
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
PrivateFontCollection fontCollection = new PrivateFontCollection();
fontCollection.AddFontFile(HttpContext.Current.Server.MapPath("~/fonts/HelveticaNeueLTStd-BlkCn.ttf"));
// prototype (1)
gr.DrawString("my text", …Run Code Online (Sandbox Code Playgroud) 如何获得DrawText()使用的字体的默认字体高度?如果可能的话我宁愿不设置新的字体.
我需要它使用GDI函数处理RGB24数据(特别是StretchBlt()非常快)我不能使用CreateCompatibleDC(),因为它只能用其他DC的颜色深度创建内存DC.通常它用于屏幕DC(通过传输NULL指针到功能),通常屏幕的颜色深度为32.此外我不能依赖它,'因为如果屏幕设置被更改,我的应用程序可能无法正常工作.
所以我需要一些方法来创建具有特定特定颜色深度的内存DC.到目前为止,我发现使用CreateDC()函数只有一种方法,但它需要许多特定于设备的参数,对我来说似乎有点不可靠.此外,有太多的字段需要填充适当的值来调用CreateDC().
是否有一些更简单的方法来创建特定的内存DC而不依赖于某些设备?或者即使创建24 bpp的内存DC?
PS我需要一些快速的图形.我已经尝试手动将alpha通道添加到位图以使用它兼容屏幕32bpp内存DC并且它已经解决了,但是太慢了.正如我上面所说,我不能依赖可以更改的屏幕设置.
我有一个 CWind 班的孩子,我在那里订阅 OnPaint 事件:
BEGIN_MESSAGE_MAP(MyListBox, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
Run Code Online (Sandbox Code Playgroud)
如果在 OnPaint 处理程序中我在窗口中绘制一些简单的东西,比如边框,一切都很好。但是如果我添加Sleep(50);(通过这样做我模拟了一些硬绘图操作)我的窗口将闪烁。我不明白为什么会发生这种情况......可能的问题是经常调用 OnPaint 函数,大约一秒内调用 2-3 次。
更新:我正在使用双重比对:首先我在 PaintDeviceContent 中绘制窗口内容,然后将此 DC 复制到窗口的 DC。
更新2:这是代码:
void CDirectionsListBox::OnPaint()
{
CRect rectClient;
GetClientRect(rectClient);
CPaintDC dc(this); // device context for painting
CDC DCMem;
DCMem.CreateCompatibleDC( &dc );
// Draw window here, workign with DCMem
dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(), &DCMem, 0, 0, SRCCOPY);
}
Run Code Online (Sandbox Code Playgroud) 我有一个表格,我用作启动画面.因为它是一个飞溅,它没有边框.启动画面是白色的,所以当它加载其他白色的东西时它看起来很有趣.我想在表格周围添加大约1 px左右的轮廓以给它一个薄边框.可以把它想象为在photoshop中为图像添加笔划.我该怎么做?我正在使用vb.net.
将Bitmap.GetPixel中的某些代码更改为使用LockBits返回的直接像素缓冲区时出现问题.似乎LockBits返回的数据确实给了我与GetPixel相比不同的Color值.
这是不幸的,因为这种变化会产生不同的颜色,从而破坏自动化单元测试.我有一个29*30像素的png文件,我将Format32bppArgb加载到位图中.这真的可能是LockBits和GetPixel的数据回归是不同的.我怎么能绕过这个?
下面是一些用加载的位图重新编写它的代码
public unsafe static Bitmap Convert(Bitmap originalBitmap)
{
Bitmap converted = new Bitmap(originalBitmap);
Rectangle rect = new Rectangle(0, 0, converted.Width, converted.Height);
var locked = converted.LockBits(rect, ImageLockMode.ReadWrite, originalBitmap.PixelFormat);
byte* pData = (byte*)locked.Scan0;
// bytes per pixel
var bpp = ((int)converted.PixelFormat >> 11) & 31;
byte* r;
byte* g;
byte* b;
byte* a;
for (int y = 0; y < locked.Height; y++)
{
var row = pData + (y * locked.Stride);
for (int x = 0; x < locked.Width; x++) …Run Code Online (Sandbox Code Playgroud) 更新:
感谢Denis Anisimov我通过替换解决了我的问题:
for (int i = 0; i < Width * Height; i++)
{
pRgb[0] = RValue;
pRgb[1] = GValue;
pRgb[2] = BValue;
pRgb += 3;
}
Run Code Online (Sandbox Code Playgroud)
有:
int BytesPerLine = Width * 3;
if (BytesPerLine % 4 != 0)
BytesPerLine += 4 - BytesPerLine % 4;
PBYTE Line = NULL;
for (int y = 0; y < Height; y++)
{
Line = pRgb;
for (int x = 0; x < Width; x++)
{
Line[0] = RValue;
Line[1] …Run Code Online (Sandbox Code Playgroud)