Bitmap bff(L"1.jpg");
bff.Save(L"2.jpg", &Gdiplus::ImageFormatJPEG, NULL);
Run Code Online (Sandbox Code Playgroud)
这将创建一个具有零字节长度的新文件2.jpg.是不是应该写一个与1.jpg相同的图像文件?
为什么我有零字节长度的文件?我正在进行此测试,因为将其他位图写入文件会产生相同的输出.
我一直在为这个夜晚的大部分时间而烦恼,所以也许你们其中一个人可以帮我一臂之力.
我发现DrawImageC#中的GDI + 对于我想要呈现的内容来说太慢了,从论坛的外观来看,对其他人来说也是如此.
我决定尝试使用AlphaBlend或BitBlt从Win32 API获得更好的性能.无论如何,我已经让我的图像显示得很好,除了一个小细节 - 无论我使用什么图像格式,我都无法让白色背景从我的(透明)图形中消失.
到目前为止,我已经尝试过BMP和PNG格式,并验证它们在C#中加载为32bppargb图像.
这是我正在做的电话:
// Draw the tile to the screen.
Win32GraphicsInterop.AlphaBlend(graphicsCanvas, destination.X, destination.Y, this.TileSize, this.TileSize,
this.imageGraphicsPointer, tile.UpperLeftCorner.X, tile.UpperLeftCorner.Y,
this.TileSize, this.TileSize,
new Win32GraphicsInterop.BLENDFUNCTION(Win32GraphicsInterop.AC_SRC_OVER, 0,
Convert.ToByte(opacity * 255),
Win32GraphicsInterop.AC_SRC_ALPHA));
Run Code Online (Sandbox Code Playgroud)
为了记录在案,AC_SRC_OVER是0x00和AC_SRC_ALPHA是0x01这是什么MSDN说,他们应该是一致的.
你们中的任何一个人都能很好地解决这个问题,或者知道一个更好(但仍然很快)的方法吗?
我想使用GDI +绘制3D边框(斜角),例如在a的Paint事件中Control.我应该自己使用DrawLine和/ KnownColors或者有什么东西可以使用吗?
谢谢Saied
我在一个简单的表单上绘制图形时遇到问题.我的代码编译并运行,但目标红框不会显示.
我在Visual Studio 2010中使用完整的.NET Framework 4.
出了什么问题,如何解决?
private void Form1_Load(object sender, EventArgs e)
{
System.Drawing.Graphics graphicsObj;
graphicsObj = this.CreateGraphics();
Pen myPen = new Pen(System.Drawing.Color.Red, 5);
Rectangle myRectangle = new Rectangle(20, 20, 250, 200);
graphicsObj.DrawRectangle(myPen, myRectangle);
}
Run Code Online (Sandbox Code Playgroud)
编辑:工作但代码慢
void BatteryPaint(object sender, EventArgs e)
{
TabPage page = (TabPage)sender;
if (!controlsSetup)
{
populateBatteryTab(page);
controlsSetup = true;
}
//Create the items
Rectangle busBar = new Rectangle();
Rectangle batPack = new Rectangle();
Rectangle pack1Outline = new Rectangle();
Rectangle pack2Outline = new Rectangle();
Rectangle pack3Outline …Run Code Online (Sandbox Code Playgroud) 有人可以给我简短的解释如何使用GDI/GDI +创建位图运行时并用颜色填充它?
提前致谢.
我已经看到了关于同一主题的问题,但无法弄清楚如何解决这个问题.在我的游戏中,我使用两个线程一个Logic线程和UI线程.这是我遇到的问题
System.InvalidOperationException: Object is currently in use elsewhere.
at System.Drawing.Graphics.FromImage(Image image)
at GECS.Core.Game.UpdateLoop() in c:\Us....ore\Game.cs:line 82
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Run Code Online (Sandbox Code Playgroud)
我只在UI线程上渲染.这是我的渲染循环.我把它放在构造函数中.
while (true) {
if (!Created) {
break;
}
if (Win32.PeekMessage(out msg, IntPtr.Zero, 0, 0, (uint)Win32.PM.REMOVE)) {
if (msg.message == (uint)Win32.WindowsMessage.WM_QUIT) {
break;
} else {
Win32.TranslateMessage(ref msg);
Win32.DispatchMessage(ref msg);
}
} else {
Text = Global.TITLE;
now = …Run Code Online (Sandbox Code Playgroud) 在我的Delphi应用程序中,我需要使用GDI和GDI +绘制多行文本.我有这些物品:
有没有一种简单的方法可以用GDI和GDI +绘制这个文本?我无法找到关于它的GDI和GDI +功能.
我有一个实现的类IDisposable,因为它使用Bitmap来自GDI +的图像资源(类).我用它来包装所有那些花哨的LockBits/ UnlockBits.它工作正常,无论是我打电话Dispose()还是using声明.
但是,如果我让程序在没有处理的情况下终止,我会得到一个System.AccessViolationException.直观地说,我认为GC将以Dispose与我相同的方式调用,并且该对象将优雅地释放资源,但这不是发生的事情.为什么?
这是IDisposable代码:
private bool _disposing = false;
~QuickBitmap() {
Dispose(false);
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool safeDispose) {
if (_disposing)
return;
SaveBits(); // private wrapper to UnlockBits
bytes = null; // byte[] of the image
bmpData = null; // BitmapData object
if (safeDispose && bm != null) {
bm.Dispose(); // Bitmap object
bm = null; …Run Code Online (Sandbox Code Playgroud) 如何在c#winforms中的Label文本上应用外发光和模糊效果.使用自定义控件
如您所见,这是自定义面板,我正在尝试为整个文本进行发光效果.
protected override void OnPaint(PaintEventArgs pe)
{
//base.OnPaint(pe);
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
GraphicsPath GP = new GraphicsPath();
GP.FillMode = FillMode.Alternate;
GP.AddString(this.Text, this.Font.FontFamily, 2, 12f, new Point(ClientRectangle.X+Text.Length*4-20, ClientRectangle.Y+10), sf);
// In Border
using (SolidBrush brush = new SolidBrush(BackColor))
pe.Graphics.FillRectangle(brush, ClientRectangle);
pe.Graphics.DrawRectangle(new Pen(Color.FromArgb(_InnerBorderColor.R, _InnerBorderColor.B, _InnerBorderColor.G), 1.0f), 0, 0, ClientSize.Width - 2, ClientSize.Height - 2);
pe.Graphics.DrawPath(new Pen(Color.Blue, 2f), GP);
pe.Graphics.DrawString(base.Text, this.Font, Brushes.Black, 2, 2);
}
Run Code Online (Sandbox Code Playgroud) 我正在用c ++ win32 api制作一个窗口。我正在使用gdi +显示gif。并且此gif从资源加载并生成IStream *。但是,当我不使用gif的路径,并使用IStream创建GDIPlus :: Image并将其显示时,gif开始闪烁。PS窗口为SW_SHOWMAXIMIZED
我试图在WM_ERASEBKGND消息中返回1,使得NULL WNDCLASSEX.hbrBackGround,使用InvalidateRect(hwnd,&rc,FALSE)PS rc是
RECT rc;
GetWindowRect(hwnd,&rc);
Run Code Online (Sandbox Code Playgroud)
但这没有用;
case WM_TIMER:
if (wParam == DRAW_ANIM)
{
pImg->SelectActiveFrame(&FrameDimensionTime, nFrm);
const Rect DRC(0, 0, pImg->GetWidth(), pImg->GetHeight());
pGphcs->Clear(Color(128, 128, 128));
pGphcs->DrawImage(pImg, DRC);
RECT rt;
GetWindowRect(hwnd, &rt);
InvalidateRect(hwnd, &rt, FALSE);
if (nFrm < (nFrmCnt - 1)) nFrm++; else nFrm = 0;
InvalidateRect(hwnd, &rt, FALSE);
}
break;
hMWDC = GetDC(hWnd);
pGphcs = new Graphics(hMWDC);
HMODULE hMod = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hMod, MAKEINTRESOURCEW(MY_GIF_ID), RT_RCDATA);
if (!hRes) MessageBox(NULL, L"hRes!!", L"ERROR", …Run Code Online (Sandbox Code Playgroud)