简要背景:我正在研究基于Web的绘图应用程序,我正在实现的工具之一是1像素厚的铅笔.该工具允许用户在画布上绘制1px别名行.
为了确定用户在画布上绘制的位置,将监视鼠标坐标.如果按住mouse1,光标所在的像素将会改变.基本上它就像Photoshop中的铅笔工具一样.
注意:Bresenham的算法不适用于这种情况.我的输入是实时提交的,所以我没有画一条从P0到P1的线,其中P0和P1之间的距离是很多像素.通常,P1是P0的邻居.
我遇到的问题是我生成的线条没有完全干净的1px重量.这是一个例子:

请注意,两条线都是手绘的,因此存在一些差异.有趣的是,Photoshop能够为我绘制的线条制作更清晰的1px表示.我的线看起来更脏的原因是因为:


在我的应用程序中使用该工具进行绘制时,红色像素被填充.在Photoshop中,红色像素未被填充.这是有道理的,因为为了从给定像素移动到例如其东南邻居,要么东或南邻居很可能会被遗弃.光标准确地越过角落进入东南邻居的可能性极小,避免了红色像素的绘制,但这通常不会发生.
所以,我留下的问题是Photoshop如何能够跳过我的线条中出现的红色像素.我唯一能想到的就是等到两个像素排队之后才能绘制其中任何一个,这样我就知道是否有一个"角落邻居"被传递过来.在这种情况下,我不会绘制两个像素中的第一个,因为它相当于我的图中的红色像素.如果用户绘制像素,将光标向南移动一个像素,然后向东移动一个像素,则存在不绘制预期像素的风险.应绘制两个像素,但算法会另外说明.
有任何想法吗?Photoshop如何处理这个问题?
我有一个将在触摸屏系统上使用的应用程序,它包含许多相当大的按钮(~100px square).
每个按钮将有1到4行文本(通常每行一个单词).
由于按钮中有大量的填充,我不得不减小文本的大小,使其变得几乎不可读,但是如果我能够减少内部填充,那么文本将直接绘制到边框那我就不会有问题了.
我试图将控件的填充减少到零,如下所示,但它没有帮助.
this.Text = _label;
this.Font = new Font(this.Font.FontFamily, (float) _size);
this.Padding = new Padding(0);
Run Code Online (Sandbox Code Playgroud)
问题的一个示例如下所示:

正如您所看到的,"OVERVIEW"这个词有足够的空间放在一行上,但是如何在不缩小字体大小的情况下实现这一目标呢?我不喜欢不得不重写控件的文本绘画代码.
编辑:我注意到将填充增加到高达300的各种值,对控件的内部填充没有任何影响.另外,对于信息,我正在使用的按钮是我从Windows.Forms.Button类继承的控件,因为我需要添加一些属性,但是我没有干涉任何Button自己的方法.
编辑
缓慢的编译时间现在可以通过子项目启用的构建大大减轻,这是一个巨大的胜利.
已经从Play的内置资产生成器(即Coffeescript和LESS)转移到第三方Grunt JS ; 现在增量构建期间的代码更改仅受scalac编译时间的限制,而不受Play的相对较慢资产生成的开销限制.
ORIGINAL
总体上非常满意Play 2.1 Scala(2012年9月14日发布,就在切换到Scala 2.10之前); 但是,有一些发展的痛点:
1)路由:在路由改变时,一个人的整个路由 - 控制器结构
can被重新编译:不好.2)由于路由
POST /foo/bar/:id冲突,REST似乎不被直接支持DELETE /foo/bar/:id; 即路径路径必须是唯一的,可能是反向路由.3)视图:每个foo动作使用scala.html文件,文件计数增长很快,这意味着构建时间越慢,编译越多; 由于缺乏IDE支持而不支持泛型和盲编码(当然,迄今为止没有scala模板引擎具有IDE支持,AFAIK)是特别棘手的领域.
4)增量构建工作,但过程中的任何内容都不能称为"snappy",即使对scala.html文件进行简单更改,实际上也需要@ 2秒,这是很长一段时间,当你想要即时代码时 - 更改浏览器刷新反馈周期.
我知道Play开发人员正在研究上述一些问题,而慢速构建时间也与sbt,scala版本和自己的代码结构直接相关.总的来说,Play一直是一种愉快的开发体验.然而,这是关于痛苦的,我想知道Lift在这方面带来了什么......
Lift似乎采取了不同的方法.升降机是否会受到以上物品的影响?假设没有,因为MVC,Lift不是,并且xml样式的片段方法可能不会产生与幕后构建机器的一些Play相同的编译时间.
Lift有哪些难点?
当我在Java 6下运行swing GUI应用程序时,它们会自动为所有字体使用我配置的子像素抗锯齿设置.与标准AA选项相比,结果有了很大改进.
但是当我绘制到图像时,我无法初始化图形上下文以使用系统的AA配置.尝试使用Java的不同AA提示是一个失败的原因,因为没有子像素方法适用于所有用户.
有没有办法继承给定图形上下文的系统AA设置,而不必选择一个并明确设置提示?目前我必须使用GASP AA来避免标准AA用小字体给出的可怕结果.我试过没有为文本AA设置任何内容,也没有设置任何AA提示.
更新2010-01-05
我想我已经把它钉死了; 当直接绘制到AWT图形上下文时,子像素AA提示似乎只被尊重; 当我画到双缓冲图像时,它只是标准AA; 但当我绕过双缓冲图像时,子像素AA完成.
否则,The_Fire的答案将适用于具有Swing可用的JVM(但不适用于J2ME JVM); 请注意,The_Fire的答案不能使用AWT组件(使用新的Label()而不是新的JLabel()失败),可能是因为在将组件实现到显示器之前无法提取FontRenderContext.
我目前为目标图像获取图形上下文的代码如下所示:
try {
if((dbImage=dctRoot.createImage(wid,hgt,1))!=null) { // if createImage returns null or throws an exception the component is not yet displayable
dbGraphics=(Graphics2D)dbImage.getGraphics();
if(dctRoot.properties.getBoolean("Antialias",true)) {
try {
// set AA on overall
dbGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING ,RenderingHints.VALUE_ANTIALIAS_ON);
// set text AA to platform/impl default
dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
// try to override platform/impl AA with font-specified AA (Java 6+)
try { dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.class.getField("VALUE_TEXT_ANTIALIAS_GASP").get(null)); } catch(Throwable thr) {;} // yes, ignore exception
}
catch(Throwable thr) { …Run Code Online (Sandbox Code Playgroud) 我想以MS Paint的风格编写一个绘画程序.
为了在用户移动鼠标时在屏幕上绘画,我必须等待鼠标移动事件并在我收到鼠标时在屏幕上绘图.显然,mose移动事件不经常发送,所以我必须通过在当前鼠标位置和前一个鼠标位置之间画一条线来插值鼠标移动.在伪代码中,这看起来像这样:
var positionOld = null
def handleMouseMove(positionNew):
if mouse.button.down:
if positionOld == null:
positionOld = positionNew
screen.draw.line(positionOld,positionNew)
positionOld = positionNew
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:使用直线段进行插值看起来太符合我的口味了,你能推荐一种更好的插值方法吗?GIMP或Adobe Photoshop采用什么方法?
或者,有没有办法增加我收到的鼠标移动事件的频率?我正在使用的GUI框架是wxWidgets.
GUI框架:wxWidgets.
(编程语言:Haskell,但这里不相关)
编辑:澄清:我想要看起来比直线段更平滑的东西,看图片(原始大小):
在鼠标位置之间绘制的锯齿状线条http://i26.tinypic.com/hwa42h.jpg
EDIT2:我使用的代码如下所示:
-- create bitmap and derive drawing context
im <- imageCreateSized (sy 800 600)
bitmap <- bitmapCreateFromImage im (-1) -- wxBitmap
dc <- memoryDCCreate -- wxMemoryDC
memoryDCSelectObject dc bitmap
...
-- handle mouse move
onMouse ... sw (MouseLeftDrag posNew _) = do
...
line dc …Run Code Online (Sandbox Code Playgroud) 我刚刚看了一下wordpad.有一个名为"插入油漆图"的功能区按钮.当我点击那个按钮时,mspaint会打开并提示我画一些东西.画完东西后,我可以点击"更新文档"按钮.没有保存选项(仅"将副本另存为").
此外,没有退出按钮.相反,它显示"退出并返回到文档"按钮.
现在我的问题是:我的C#桌面应用程序中是否以及如何从此功能中受益?我想过一些IPC,但我无法弄清楚它是如何工作的.有人有个主意吗?
我想学习如何在我的Android应用程序中创建图层(如在photoshop中).我想实现一个基本的东西:当我在画布中添加一个图像时,例如,我想要能够绘制画布,但画面不能影响图形的线条.然后我需要将该图像保存在我的SD卡上.
有什么建议/意见/例子吗?我可以用什么来实现这个目标?
令我很生气的是,在Windows中调整窗口的大小并不像我希望的那样"平滑"(Windows程序通常就是这种情况,而不仅仅是我自己的.Visual Studio就是一个很好的例子).它使操作系统及其程序感觉"脆弱"和"便宜"(是的,我关心程序和用户界面的感觉,就像我关心关闭车门的声音和感觉一样.这是构建的反映质量),在我看来影响整体用户体验,最终影响品牌的感知.
重新调整大小时,重新绘制窗口内容无法跟上鼠标移动的步伐.每当我调整窗口大小时,都会出现"口吃"/"闪烁"效果,这似乎是由于在绘制新的已调整大小的内容之前,在新的已调整大小的窗口框架中重绘了窗口的先前大小内容.
我正在构建一个使用Direct2D 1.1绘制UI的Win32应用程序(x64),并且考虑到Direct2D的速度,我认为在2014年操作系统中不应该有这样的工件.我自己在Windows 8.1上,但是目标是Windows 7及以上版本的应用程序.
当最大化小窗口时,"先前大小"效果尤其明显(因为窗口大小的差异足以容易地对比旧内容的图像,因为它在较大窗口的左上角短暂闪烁与新内容随后被涂在上面).
这似乎是正在发生的事情:
我想知道是否有任何方法可以缓解这种情况(即摆脱第4步) - 例如通过拦截Windows消息 - 并避免在最终重新呈现之前使用旧内容重新绘制新大小的窗口新内容发生了.这就像Windows窗口重绘自己,使用已有的任何图形,之前很难要求我提供WM_PAINT消息或类似的更新内容.
可以吗?
编辑:似乎 WM_WINDOWPOSCHANGING/WM_SIZING 提供了对新大小数据的"早期访问",但我仍然没有设法抑制旧内容的绘制.
我WndProc看起来像这样:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_ERASEBKGND:
return 1;
case WM_PAINT:
PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);
D2DRender();
EndPaint(hWnd, &ps);
return 0;
case WM_SIZE:
if (DeviceContext && wParam != SIZE_MINIMIZED)
{
D2DResizeTargetBitmap();
D2DRender();
}
return 0;
case WM_DISPLAYCHANGE:
D2DRender(); …Run Code Online (Sandbox Code Playgroud) 任务是简单地获取车辆图像的默认十六进制颜色(先前已知 - 在本例中为#bdd4de)并将其动态切换为用户选择的颜色。对于阴影,我可以简单地重复此过程并将其更改为所选颜色的较暗版本。
我尝试过使用 ColorFiltered 小部件,但它似乎不适合提到的特定功能。我正在考虑尝试画布,但是绘制需要着色的形状是不可行的,因为我有更多的车辆,并且我认为更改特定六角形的方法应该是最佳方法。
paint ×10
.net ×2
algorithm ×1
android ×1
antialiasing ×1
api ×1
button ×1
c# ×1
c++ ×1
canvas ×1
colors ×1
dart ×1
direct2d ×1
draw ×1
drawing ×1
flutter ×1
fonts ×1
graphics ×1
ipc ×1
java ×1
layer ×1
lift ×1
mouse ×1
mouseover ×1
point ×1
pygame ×1
python ×1
winapi ×1
windows ×1
winforms ×1
wxwidgets ×1