标签: gdi

StretchBlt 打印失败

我有一个图表(位图格式),我正在尝试使用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)

printing winapi gdi

2
推荐指数
1
解决办法
1848
查看次数

Windows移动或CE设备上的GDI性能

我有一个使用大量矢量图形的Windows CE应用程序,并且在某些地方非常慢.我目前正在使用GDI通过位图进行渲染,以实现无闪烁刷新.通常情况下,我正在看一个大型3D地图的一部分.在某些设备上(例如166mhz SH4),大数据集的刷新时间为3-5秒.我的问题是这个;

  • 有没有人对Windows Mobile与Win32的图形操作的相对速度进行任何比较.换句话说,假设我们只是在寻找GDI调用,是从适用于WinCE版本的软件的Win32版本中分析结果.

  • 有没有人尝试在WinCE平台(C++应用程序)上进行性能分析,如果是的话,使用什么工具.

  • 是否有人知道任何提高Windows CE绘图速度的方法.我目前正在关注FastGraph 之前的问题反馈,但这是一个稍长期的解决方案.糟糕而且全部都是这样,我正在为即将发布的版本更快地寻找更好的东西.

profiling gdi windows-mobile windows-ce

2
推荐指数
1
解决办法
2648
查看次数

在.Net中将带有笔划的文本绘制到图像上

我目前正在使用.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)

.net graphics text gdi

2
推荐指数
1
解决办法
3525
查看次数

在gdi中,如何清除DC的背景色。因此,绘制的文本将不显示背景颜色

当我使用 DC 绘制文本时,它总是显示与窗口背景不同的背景颜色。

winapi gdi

2
推荐指数
1
解决办法
1712
查看次数

获取win32 DrawText()的默认字体高度

如何获得DrawText()使用的字体的默认字体高度?如果可能的话我宁愿不设置新的字体.

c windows winapi gdi

2
推荐指数
1
解决办法
3486
查看次数

如何创建每像素24位的内存DC?

我需要它使用GDI函数处理RGB24数据(特别是StretchBlt()非常快)我不能使用CreateCompatibleDC(),因为它只能用其他DC的颜色深度创建内存DC.通常它用于屏幕DC(通过传输NULL指针到功能),通常屏幕的颜色深度为32.此外我不能依赖它,'因为如果屏幕设置被更改,我的应用程序可能无法正常工作.

所以我需要一些方法来创建具有特定特定颜色深度的内存DC.到目前为止,我发现使用CreateDC()函数只有一种方法,但它需要许多特定于设备的参数,对我来说似乎有点不可靠.此外,有太多的字段需要填充适当的值来调用CreateDC().

是否有一些更简单的方法来创建特定的内存DC而不依赖于某些设备?或者即使创建24 bpp的内存DC?

PS我需要一些快速的图形.我已经尝试手动将alpha通道添加到位图以使用它兼容屏幕32bpp内存DC并且它已经解决了,但是太慢了.正如我上面所说,我不能依赖可以更改的屏幕设置.

c++ winapi gdi device-context

2
推荐指数
1
解决办法
1609
查看次数

在 OnPaint 中闪烁

我有一个 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)

winapi mfc gdi visual-c++

2
推荐指数
1
解决办法
1406
查看次数

如何围绕无边框形式绘制轮廓?

我有一个表格,我用作启动画面.因为它是一个飞溅,它没有边框.启动画面是白色的,所以当它加载其他白色的东西时它看起来很有趣.我想在表格周围添加大约1 px左右的轮廓以给它一个薄边框.可以把它想象为在photoshop中为图像添加笔划.我该怎么做?我正在使用vb.net.

vb.net user-interface gdi visual-studio-2010

2
推荐指数
1
解决办法
4296
查看次数

Bitmap.LockBits给出错误的值?

将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)

c# windows gdi

2
推荐指数
1
解决办法
1182
查看次数

CreateDIBSection图形工件或如何正确访问位图位

更新:

感谢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)

c++ winapi gdi

2
推荐指数
1
解决办法
1224
查看次数