谢谢你的回答,其实我并不感到疑惑,画面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的男性?
使用C++和.net我想要显示一个数据流作为滚动图像.每次我得到一些新数据时,我想将其添加为新行(128x1像素)并将之前的内容滚动到一侧.
我对这个问题的第一次尝试涉及每次获得新行时渲染整个数据集.这有效,但速度太慢,所以我认为写入某种缓冲区可能更有意义(可能是位图?).问题是我无法看到我能做到这一点; Graphic对象允许你画得很开心,但我看不出一种明显的方法告诉我的控件使用一个Bitmap对象作为它的缓冲区?同样,我看不到一种绘制位图的方法,然后我可以将其写入屏幕.
这一定是可能的,但到目前为止我的google-foo已经失败了......
[编辑1]为了澄清,数据是一个频谱图.下图显示了我试图实现的那种事情:
我正在绘制的数据来自浮点数组.没有什么可以限制我会得到多少,所以我只想忘记数据,因为它从情节的一侧掉落.
我目前正在从a继承System::Windows::Forms::UserControl,但如果有更好的替代品,可以切换到别的东西吗?
我正在使用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) …
如何旋转图像然后移动到左上角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) 在了解如何生成图像,绘制图像,在其上写文本等基本步骤方面,我已经熟悉System.Drawing命名空间.但是,对于接近打印质量的任何事情来说,它都是如此慢.我已经看到一些建议使用COM与本机Windows GDI交谈以更快地完成此操作,但我想知道是否有任何优化我可以进行高速,高质量的图像生成.我尝试过使用抗锯齿选项,并且可以立即使用图形,位图和图像对象,但是我可以采用其他任何技术来实现这种高速度吗?
写这个我只是想到使用.Net 4中的任务库做更多工作,即使每个生成任务都不会更快.
无论如何,思想和评论赞赏.
谢谢!
我在这个程序中使用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) 大家好,我有双缓冲的问题.我不知道为什么,但我的文字不是绘图(没有双缓冲文本是绘图).
这是代码:
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)
怎么了?
我收到了带有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) 如何实现自定义控件的滚动?我的控件是完全自定义绘制的,其高度是可变的,并且控件的一部分包含一个菜单,因此,如果控件中有很多项目,则需要在其中放置滚动条。我真的无法找到有关如何执行此操作的任何线索。我确实看到了有关的信息ScrollableControl,但是我仍然不确定这是否是我需要的。
另外,我的控件如何知道何时需要显示滚动条?因为我的控件是完全自定义绘制的,所以里面没有真正的“控件”,所以只绘制了一堆像素,所以我不能像将AutoScroll设置为true一样,因为它不是控件的主要部分需要滚动,它是控件上需要滚动条的特定位置。
我使用jquery 插件和html 在Web应用程序中设计了循环按钮列表.在这个设计用户中,一次只选择一个单选按钮列表.设计如下所示:
如何在Windows窗体中实现相同的设计和功能?请帮助我,从我开始实现这一目标.