标签: gdi+

GDI +的惊人的解码速度和糟糕的绘制速度!


谢谢你的回答,其实我并不感到疑惑,画面1024*768像素比100*100像素慢...这是一个如此简单的逻辑..这让我感到困惑的是,DrawImage的插值算法可能会很慢,而存在很多更好的算法,它的解码器似乎可以从具有一定分辨率的jpg解码,它真的很酷,我搜索了一段时间但没有找到任何免费的lib来做这个...

真奇怪!我在Paint方法中添加以下代码.c:\ 1.jpg是5M jpg文件,大约4000*3000

// ------------------------------------------------ --------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,200,200);
Run Code Online (Sandbox Code Playgroud)

以上真的很快!甚至是实时!我不认为解码5米JPG可以那么快!

// ------------------------------------------------ --------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,2000,2000);
Run Code Online (Sandbox Code Playgroud)

上面的代码变得非常慢

// ------------------------------------------------ --------------

如果我添加Bitmap = Bitmap :: FromFile(L"c:\ 1.jpg",true); //进入构造

离开

    Graphics graphics(hdc);
    graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
    graphics.DrawImage(bitmap,0,0,2000,2000);
Run Code Online (Sandbox Code Playgroud)

在OnPaint方法中,代码仍然有点慢~~~

// ------------------------------------------------ ------------------

与解码相比,drawImage Process非常慢......

他们为什么以及如何做到这一点?微软是否支付了负责解码器双倍工资的男性,而不是负责编写drawingImage的男性?

drawing gdi+ decoder

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

如何写入(Bitmap?)图像缓冲区以获得更快的GDI +显示?

使用C++和.net我想要显示一个数据流作为滚动图像.每次我得到一些新数据时,我想将其添加为新行(128x1像素)并将之前的内容滚动到一侧.

我对这个问题的第一次尝试涉及每次获得新行时渲染整个数据集.这有效,但速度太慢,所以我认为写入某种缓冲区可能更有意义(可能是位图?).问题是我无法看到我能做到这一点; Graphic对象允许你画得很开心,但我看不出一种明显的方法告诉我的控件使用一个Bitmap对象作为它的缓冲区?同样,我看不到一种绘制位图的方法,然后我可以将其写入屏幕.

这一定是可能的,但到目前为止我的google-foo已经失败了......

[编辑1]为了澄清,数据是一个频谱图.下图显示了我试图实现的那种事情:

alt text http://www.geekops.co.uk/photos/0000-00-02%20(Forum%20images)/ScrollingGraphicsAlgorithmExplanation.png

我正在绘制的数据来自浮点数组.没有什么可以限制我会得到多少,所以我只想忘记数据,因为它从情节的一侧掉落.

我目前正在从a继承System::Windows::Forms::UserControl,但如果有更好的替代品,可以切换到别的东西吗?

.net buffer drawing gdi+ bitmap

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

在矩形下反转1bbp颜色

我正在使用GDI +,我正在使用的图像是一个1bbp的图像.我想做的是在图像上绘制一个矩形,该矩形下的所有内容都将被反转(白色像素将变为黑色,黑色像素变为白色).

我见过的所有示例代码都是针对8位RGB色阶图像,我不认为他们使用的技术对我有用.

这是我到目前为止的代码.这是父控件,其中一个Epl2.IDrawableCommand将是执行反转的命令.

public class DisplayBox : UserControl
{
    (...)
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        (...)
            using (Bitmap drawnLabel = new Bitmap((int)((float)Label.LabelHeight * _ImageScaleFactor), (int)((float)Label.LableLength *(int) _ImageScaleFactor), System.Drawing.Imaging.PixelFormat.Format1bppIndexed))
            {
                using (Graphics drawBuffer = Graphics.FromImage(drawnLabel))
                {
                    (...)
                    foreach (Epl2.IDrawableCommand cmd in Label.Collection)
                    {
                        cmd.Paint(drawBuffer);
                    }
                    (...)
                }
            }
        }
    }
}
public class InvertArea : IDrawableCommand
{
    (...)
    public Rectangle InvertRectangle {get; set;}
    public void Paint(Graphics g)
    {
        throw new NotImplementedExecption();
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该Paint(Graphic g) …

c# gdi+ colors

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

如何旋转图像然后移动到左上角0,0而不切断图像

如何旋转图像然后移动到左上角0,0而不切断图像.

请阅读代码中的注释.我陷入了第3步,我认为使用三角法应该能够解决这个问题.

谢谢

private Bitmap RotateImage(Bitmap b, float angle)
{
    //create a new empty bitmap to hold rotated image
    Bitmap returnBitmap = new Bitmap(b.Width, b.Height);
    //make a graphics object from the empty bitmap
    Graphics g = Graphics.FromImage(returnBitmap);
    //STEP 1 move rotation point to top left
    g.TranslateTransform((float)0, (float)0);
    //STEP 2 rotate
    g.RotateTransform(angle);
    //STEP 3 move image back to top left without cutting off the image
    //SOME trigonometry calculation here
    int newY = b.Height;
    g.TranslateTransform(-(float)0, -newY);
    //draw passed in image onto graphics …
Run Code Online (Sandbox Code Playgroud)

c# gdi+

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

如何使用.NET快速生成图像

在了解如何生成图像,绘制图像,在其上写文本等基本步骤方面,我已经熟悉System.Drawing命名空间.但是,对于接近打印质量的任何事情来说,它都是如此慢.我已经看到一些建议使用COM与本机Windows GDI交谈以更快地完成此操作,但我想知道是否有任何优化我可以进行高速,高质量的图像生成.我尝试过使用抗锯齿选项,并且可以立即使用图形,位图和图像对象,但是我可以采用其他任何技术来实现这种高速度吗?

写这个我只是想到使用.Net 4中的任务库做更多工作,即使每个生成任务都不会更快.

无论如何,思想和评论赞赏.

谢谢!

.net c# gdi+ gdi

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

BitBlt问题GDI

我在这个程序中使用BitBlt时遇到了麻烦.您调整窗口大小,椭圆随之调整大小.当然,使用普通的hdc方法,它是波涛汹涌的.我尝试了BitBlt方法,但这也不起作用(可能是因为我做错了).有人可以解决我的错误吗?感谢名单

    bool sizing; //global   
case WM_PAINT:
    {
        RECT rect;
        GetClientRect(hwnd, &rect);
        hdc = BeginPaint(hwnd, &ps);
        mem = CreateCompatibleDC(hdc);
        SelectObject(mem, GetStockObject(HOLLOW_BRUSH));
        if(sizing)
        {
        Ellipse(mem,rect.left, rect.top, rect.right, rect.bottom);
        }
    BitBlt(hdc, rect.left, rect.top, rect.left - rect.right, rect.top -rect.bottom , mem, rect.left, rect.top, SRCCOPY);
        DeleteDC(mem);
        EndPaint(hwnd, &ps);
        break;
    }
    case WM_SIZE:
        sizing = true;
        break;
Run Code Online (Sandbox Code Playgroud)

c++ winapi gdi+ gdi ellipse

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

C++/WinAPI GDI +双缓冲

大家好,我有双缓冲的问题.我不知道为什么,但我的文字不是绘图(没有双缓冲文本是绘图).

这是代码:

m_hDC = BeginPaint(m_hWnd, &m_ps);

m_graphics = new Graphics(m_hDC);
memDC = CreateCompatibleDC(m_hDC);
pMemGraphics = new Graphics(memDC);

pMemGraphics->DrawString(L"Hello world!", -1, font, PointF(100, 100), &brush);

BitBlt(m_hDC, 0, 0, 500, 200, memDC, 0, 0, SRCCOPY);
EndPaint(m_hWnd, &m_ps);

delete(pMemGraphics);
delete(m_graphics);
Run Code Online (Sandbox Code Playgroud)

怎么了?

c++ double winapi gdi+ buffering

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

对标记为ASCII的EXIF属性使用UTF8解码是否安全?

我收到了带有EXIF ImageDescription元数据的图像文件,其值为"Test accents:éâäàè".当使用.NET GDI +类提取此数据时,它会报告它以ASCII格式存储,但在使用ASCII解码器时会获得垃圾数据.通过反复试验,我发现我可以使用UTF8解码器正确提取它.

这是示例代码:

public string GetDescription()
{
  const string filePath = @"C:\test_image.jpg";

  using (var bmp = new System.Drawing.Bitmap(filePath))
  {
    var propItem = bmp.PropertyItems.FirstOrDefault(p => p.Id == 270); // EXIF ImageDescription

    if (propItem == null)
      return null;

    string value = null;

    if (propItem.Type == 2) // ASCII
    {
      // Does not work: Returns "Test accents: ??????????"
      var asciiEnc = new System.Text.ASCIIEncoding();
      value = asciiEnc.GetString(propItem.Value, 0, propItem.Value.Length - 1);

      // CORRECT: Returns "Test accents: éâäàè"
      var utf8Enc = new …
Run Code Online (Sandbox Code Playgroud)

.net c# gdi+ exif

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

如何实现自定义控件的滚动?

如何实现自定义控件的滚动?我的控件是完全自定义绘制的,其高度是可变的,并且控件的一部分包含一个菜单,因此,如果控件中有很多项目,则需要在其中放置滚动条。我真的无法找到有关如何执行此操作的任何线索。我确实看到了有关的信息ScrollableControl,但是我仍然不确定这是否是我需要的。

另外,我的控件如何知道何时需要显示滚动条?因为我的控件是完全自定义绘制的,所以里面没有真正的“控件”,所以只绘制了一堆像素,所以我不能像将AutoScroll设置为true一样,因为它不是控件的主要部分需要滚动,它是控件上需要滚动条的特定位置。

.net c# gdi+ gdi winforms

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

Windows窗体中的圆形RadioButton列表

我使用jquery 插件和html 在Web应用程序中设计了循环按钮列表.在这个设计用户中,一次只选择一个单选按钮列表.设计如下所示:

在此输入图像描述

如何在Windows窗体中实现相同的设计和功能?请帮助我,从我开始实现这一目标.

.net c# user-controls gdi+ winforms

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

标签 统计

gdi+ ×10

c# ×6

.net ×5

gdi ×3

c++ ×2

drawing ×2

winapi ×2

winforms ×2

bitmap ×1

buffer ×1

buffering ×1

colors ×1

decoder ×1

double ×1

ellipse ×1

exif ×1

user-controls ×1