如何在C#中使用GDI从图像创建每像素1位掩码?我试图创建掩码的图像保存在System.Drawing.Graphics对象中.
我见过在循环中使用Get/SetPixel的例子,这些例子太慢了.我感兴趣的方法是只使用BitBlits的方法,就像这样.我只是不能让它在C#中工作,任何帮助都非常感谢.
我有一些JPEG文件似乎无法加载到我的C#应用程序中.它们可以很好地加载到其他应用程序中,例如GIMP.这是我用来加载图像的代码行:
System.Drawing.Image img = System.Drawing.Image.FromFile(@"C:\Image.jpg");
Run Code Online (Sandbox Code Playgroud)
我得到的例外是:"GDI +中发生了一般错误.",这实际上不是很有帮助.有没有其他人遇到这个,或知道解决方法?
我目前正在尝试让我的C#程序在Linux上运行.在我的Linux机器上使用mono,程序运行正常.所以我使用了mkbundle,所有这些都是正确编译的.但是当我尝试在任何其他Linux机器上运行捆绑的程序时,我收到此错误:
Unhandled Exception: System.TypeInitializationException: An exception was thrown by the
type initializer for System.Windows.Forms.XplatUI --->
System.TypeInitializationException: An exception was thrown by the type initializer for
System.Drawing.GDIPlus ---> System.DllNotFoundException: libgdiplus.so.0
Run Code Online (Sandbox Code Playgroud)
这是我使用的mkbundle命令:
mkbundle --static program.exe --deps -o a.out
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用mkbundle2而没有运气.
我想也许有一种方法可以专门包含mkbundle的库(比如告诉在哪里找到libgdiplus).它应该在我使用mkbundle时链接,但我想这不是因为当我在任何其他Linux机器上运行我的程序(不运行单声道)时,我收到此错误.
两台机器都运行Ubuntu 10.10 AMD64.
使用GDI +进行编程时,我是否需要坚持使用模式来处理各种对象,如Brush,Font,这会使代码变得非常混乱.
有什么建议?
ImageList有一个名为"Draw"的方法:
imageList.Draw(graphics, bounds.X, bounds.Y, bounds.Width, bounds.Height, imgIndex);
Run Code Online (Sandbox Code Playgroud)
我使用此方法在PrintDocument的图形对象上绘制图像.使用原始图像尺寸(16 x 16像素)时,图像绘制正确.但是,如果我更改边界大小,则不会绘制任何内容.即使将尺寸更改为32 x 32(双倍尺寸)也无效.什么都没画.我需要改变绘制的大小,因为dpi不同......我在哪里错了?
编辑:解决方案似乎只是使用g.DrawImage方法.为什么imageList.Draw()不绘制仍然是我的一个谜...
g.DrawImage(imageList.Images[imgIndex], bounds);
Run Code Online (Sandbox Code Playgroud) 我正在编写一个从头开始的文本框,以便优化语法高亮.但是,我需要以像素为单位获得字符的宽度,而不是像Graphics :: MeasureString给我的垃圾.我在网上发现了很多东西,特别是这个,然而,它似乎都没有用,或者没有考虑到标签.我需要以最快的方式来测量字符的精确尺寸(以像素为单位)和制表符空间.我似乎无法想出这一个......
应该提到我正在使用C++,CLR/CLI和GDI +
这是我的测量功能.在另一个函数中,它返回的RectangleF被绘制到屏幕:
RectangleF TextEditor::MeasureStringWidth(String^ ch, Graphics^ g, int xDistance, int lineYval)
{
RectangleF measured;
Font^ currentFont = gcnew Font(m_font, (float)m_fontSize);
StringFormat^ stringFormat = gcnew StringFormat;
RectangleF layout = RectangleF(xDistance,lineYval,35,m_fontHeightPix);
array<CharacterRange>^ charRanges = {CharacterRange(0,1)};
array<Region^>^ strRegions;
stringFormat->FormatFlags = StringFormatFlags::DirectionVertical;
stringFormat->SetMeasurableCharacterRanges(charRanges);
strRegions = g->MeasureCharacterRanges(ch, currentFont, layout, stringFormat);
if(strRegions->Length >= 1)
measured = strRegions[0]->GetBounds(g);
else
measured = RectangleF(0,0,0,0);
return measured;
}
Run Code Online (Sandbox Code Playgroud)
我真的不明白MeasureCharacterRanges layoutRect参数的作用.我修改了Microsofts示例中的代码,仅使用或仅测量一个字符.
我想使用以下代码在 WM_PAINT 消息处理程序中绘制很多行。
//DrawLine with double buffering
LRESULT CALLBACK CMyDoc::OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
std::vector<Gdiplus::Point> points;
std::vector<Gdiplus::Point>::iterator iter1, iter2;
HDC hdc, hdcMem;
HBITMAP hbmScreen, hbmOldBitmap;
PAINTSTRUCT ps;
RECT rect;
hdc = BeginPaint(hWnd, &ps);
//Create memory dc
hdcMem = CreateCompatibleDC(hdc);
GetClientRect(hWnd, &rect);
hbmScreen = CreateCompatibleBitmap(hdc, rect.right, rect.bottom);
hbmOldBitmap = (HBITMAP)SelectObject(hdcMem, hbmScreen);
//Fill the rect with white
FillRect(hdcMem, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
//Draw the lines
Gdiplus::Graphics graphics(hdcMem);
Gdiplus::Pen blackPen(Gdiplus::Color(255, 0, 0));
points = m_pPolyLine->GetPoints();
for (iter1 = points.begin(); iter1 != points.end(); iter1++) …Run Code Online (Sandbox Code Playgroud) 无论我做什么,我都会在图标周围出现白色/黑色边框......是什么给出了什么?!
甚至可以正确地做到这一点吗?如何将HICON复制到具有透明度的GDI +位图?
我以为我会刺杀自己的简单TextBox控件。我不太确定它们是如何编写的,但是我看了一下Windows Forms TextBox的参考源,它只是添加了很多其他问题,所以我想问自己一些问题,这些问题取决于如何我认为做了一个TextBox控件:
如何绘制字符/文字?由于我将从头开始创建TextBox,因此显然需要进行绘制。因此,知道在WinForms中绘制某些内容时,您不仅需要选择该文本,还需要处理MouseDown和MouseMove事件,获取按下鼠标的位置,然后确定哪一个字符是在那个位置。但是,除非将角色及其坐标保存在某个地方,否则我们无法真正做到这一点。这意味着我们可能需要使用一个列表来存储用户键入的所有内容:
List<Character> characters = new List<Character>();
class Character
{
public string Text { get; set; }
public Location { get; set; }
public Size { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我们已经知道了该字符的位置,我们需要绘制一个填充的矩形,以便用户知道他们要选择的内容。我们可以通过在先前确定的坐标处获取字符的大小和位置来做到这一点。
这基本上是TextBox的工作方式吗?
1)当用户键入内容时,我们使用DrawString绘制“键入的内容”,然后将其大小和位置存储在列表中以备将来参考?2)当用户“选择”文本时,我们在列表中查找用户“选择”的坐标,然后在该位置绘制一个填充的矩形?
我正在编写一个C应用程序,并在我的代码中调用了构造函数GdipCreateBitmapFromHBITMAP。
我知道不应从C调用构造函数,但我在这里使用了“ hack”“ 如何获取屏幕截图并将其保存为Windows上的JPEG? ”
我不确定如何释放在调用期间分配的资源GdipCreateBitmapFromHBITMAP。
我尝试在文档中寻求帮助,但一无所获。
ULONG *pBitmap = NULL;
lGdipCreateBitmapFromHBITMAP = (pGdipCreateBitmapFromHBITMAP)GetProcAddress(hModuleThread, "GdipCreateBitmapFromHBITMAP");
lGdipCreateBitmapFromHBITMAP(hBmp, NULL, &pBitmap);
Run Code Online (Sandbox Code Playgroud)
我该如何释放pBitmap?
非常感谢。