我有两个从pngs加载的BufferedImages.第一个包含图像,第二个包含图像的alpha蒙版.
我想通过应用alpha蒙版来创建两者的组合图像.我的google-fu让我失望了.
我知道如何加载/保存图像,我只需要从两个BufferedImages到一个带有正确alpha通道的BufferedImage.
从最初的问题(下面),我现在提供以下奖励:
AlphaComposite
圆角的基础解决方案.
JPanel
. 希望有人快速选择这个,这似乎很容易.
如果有一个充分解释的原因,为什么永远不会这样做,其他人同意,我也会奖励赏金.
这是我想到的一个示例图像(但使用AlphaComposite
)
原始问题
我一直试图找到一种使用合成来做圆角的方法,非常类似于如何用Java制作圆角图像或http://weblogs.java.net/blog/campbell/archive/2006/07/ java_2d_tricker.html.
但是,我没有中间BufferedImage的尝试不起作用 - 圆形目标合成显然不会影响源.我尝试了不同的东西,但没有任何作用.应该得到一个圆形的红色矩形,而不是我得到一个正方形.
所以,我有两个问题,真的:
1)有没有办法使这项工作?
2)中间图像是否会实际产生更好的性能?
SSCCE:
测试面板TPanel
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JLabel;
public class TPanel extends JLabel {
int w = 300;
int h = 200;
public TPanel() {
setOpaque(false);
setPreferredSize(new Dimension(w, h));
setMaximumSize(new Dimension(w, h));
setMinimumSize(new Dimension(w, h));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用无头铬(使用puppeteer)将 html打印为 pdf并且一切正常,除非 html 包含大型 png 图像(超过 10.000x10.000px),渲染页面的整个过程需要非常长的时间(最多半小时,但如果使用非无头模式只需要大约 10 秒)。经过几天的调查和调整,我得出结论,这一定是页面合成过程的问题。
以下是chrome://gpu
无头和非无头模式下的页面转储。只有显著差异我注意到的是,headlessly乳宁镶边时,操纵木偶本身追加--disable-gpu-compositing
和--allow-pre-commit-input
我相信这些负责戏剧性的服务表现下拉。
此外,在非无头模式下,chrome 看到 2 个 GPU 单元:
GPU0 VENDOR= 0x10de, DEVICE=0x1d01 *ACTIVE*
GPU1 VENDOR= 0x8086, DEVICE=0x1912
Run Code Online (Sandbox Code Playgroud)
在无头模式下只有一个:
GPU0 VENDOR= 0xffff [Google Inc.], DEVICE=0xffff [Google SwiftShader] *ACTIVE*
Run Code Online (Sandbox Code Playgroud)
这是 Vulkan 和 OpenGL ES 图形 API 的基于 CPU 的实现。
所以基本上我的问题是:
有没有办法使用实际的gpu(特别是gpu合成)使用puppeteer运行无头铬/铬,或者有没有办法在非无头模式下将页面打印为pdf?
这是我的非无头 chrome gpu 配置(页面渲染速度很快):
Canvas: Hardware accelerated
Flash: Hardware accelerated
Flash Stage3D: Hardware accelerated
Flash Stage3D Baseline profile: Hardware accelerated
Compositing: Hardware accelerated …
Run Code Online (Sandbox Code Playgroud) 我正在使用CISourceOverCompositing
叠加图像顶部的文本,当文本图像不完全不透明时,我会得到意想不到的结果.深色不够暗,输出图像中的浅色太亮.
我在一个简单的Xcode项目中重新创建了这个问题.它创建一个图像,其中橙色,白色,黑色文本用0.3 alpha绘制,看起来是正确的.我甚至将该图像投入草图,将其放在背景图像的顶部,看起来很棒.屏幕底部的图像显示了Sketch中的外观.问题是,在使用背景上覆盖文本后CISourceOverCompositing
,白色文本太不透明,好像alpha为0.5,而黑色文本几乎不可见,就好像alpha为0.1.顶部图像显示以编程方式创建的图像.您可以拖动滑块来调整alpha(默认值为0.3),这将重新创建结果图像.
代码当然包含在项目中,但也包含在此处.这将创建0.3 alpha的文本叠加层,其显示为预期.
let colorSpace = CGColorSpaceCreateDeviceRGB()
let alphaInfo = CGImageAlphaInfo.premultipliedLast.rawValue
let bitmapContext = CGContext(data: nil, width: Int(imageRect.width), height: Int(imageRect.height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: alphaInfo)!
bitmapContext.setAlpha(0.3)
bitmapContext.setTextDrawingMode(CGTextDrawingMode.fill)
bitmapContext.textPosition = CGPoint(x: 20, y: 20)
let displayLineTextWhite = CTLineCreateWithAttributedString(NSAttributedString(string: "hello world", attributes: [.foregroundColor: UIColor.white, .font: UIFont.systemFont(ofSize: 50)]))
CTLineDraw(displayLineTextWhite, bitmapContext)
let textCGImage = bitmapContext.makeImage()!
let textImage = CIImage(cgImage: textCGImage)
Run Code Online (Sandbox Code Playgroud)
接下来,文本图像覆盖在背景图像的顶部,这不会按预期显示.
let combinedFilter = CIFilter(name: "CISourceOverCompositing")!
combinedFilter.setValue(textImage, forKey: "inputImage")
combinedFilter.setValue(backgroundImage, forKey: "inputBackgroundImage")
let …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序来创建图像,其色调,饱和度和值根据不同的参数而变化.出于性能原因,分别渲染色调,饱和度和值组件,然后使用Photoshop样式混合模式(乘法,叠加,屏幕,色调等)将它们合成在一起是有意义的.
我已经知道如何为RGB图像执行此操作:将每个通道分成自己的红色,绿色或蓝色图像,其值从透明到该通道的颜色.将它们一起层叠在黑色上并将它们的混合模式设置为屏幕,嘿,你有你的彩色图像:
如何使用HSV值定义的图像执行此操作?我的应用程序经常更改其中一个通道而不更改其他两个通道,如果我可以在GPU上合成现有图像而不是每次更改时都呈现全新图像,它将加快我的渲染速度.
这是一个例子:
在此示例中,色调在圆周周围从0º到360º变化,饱和度从中心到边缘从0%到100%变化,亮度(V)在圆周周围从0%变化到100%.这是我的应用程序创建的典型图像.是否有一些常见的混合模式可以用来分别创建这些通道并以数学上完美的方式组合它们?
我想写一个基本的硬件加速窗口管理器,所以我一直在寻找一些关于如何入门的文档,但我只是设法找到了这个教程,它使用了过时版本的Clutter而不会使用当前可用的任何版本构建.有没有其他好的资源可以做到这一点,或者,一个非常简单的合成WM来查看源?
当我使用FFmpeg(avcodec_decode_video2()
,sws_scale()
)和一些视频(例如,ProRes4444)解码视频帧时,我得到预先乘以alpha的颜色,并且使用其他视频(例如,QuickTime PNG),我得到的颜色不是预先倍增的通过alpha.
如何判断颜色是否预先倍增?或者,我如何告诉FFmpeg始终提供预乘或未预乘("直alpha")颜色?
我试图用Cocoa绘制一个形状的反射.我已经应用了NSAffineTransform并成功重新绘制了形状,但现在我无法弄清楚如何在其上绘制alpha蒙版.我正在使用一个NSCompositeDestinationOut
操作,但它给了我一个不需要的结果:alt text http://img687.imageshack.us/img687/2417/capturedcran20100623094.png
我不确定如何解决这个问题 - 我需要这样做才能使渐变仅作为alpha蒙版而实际显示.我使用错误的合成模式吗?
谢谢!如果需要,这是渐变代码:
- (void)fadeOutRect:(NSRect)rect {
[NSGraphicsContext saveGraphicsState];
[[NSGraphicsContext currentContext] setCompositingOperation:NSCompositeDestinationOut];
NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations:
[[NSColor blackColor] colorWithAlphaComponent:0.5], 0.0,
[[NSColor blackColor] colorWithAlphaComponent:1.0], 0.8, nil];
[gradient drawInRect:NSMakeRect(rect.origin.x, rect.origin.y + rect.size.height - ( PILL_HEIGHT * 2 ),
rect.size.width, PILL_HEIGHT) angle:270];
[NSGraphicsContext restoreGraphicsState];
}
Run Code Online (Sandbox Code Playgroud) 我试图了解如何CIAdditionCompositing
工作。
作为测试的一部分,我创建了一个方形的中灰色图像:
和一个方形的黑色图像:
当我使用CIAdditionCompositing
补丁组合这两个正方形图像时,我希望看到一个灰色正方形,其颜色与原始中灰色正方形完全匹配(因为黑色图像的所有颜色分量都具有值 0)。然而,最终的结果实际上比原始的灰度图像更亮:
我不明白这个结果是如何产生的。我对CIAdditionCompositing
工作原理有什么误解?
我正在寻找使用ffmpeg合成视频的方法,无论合成视频的宽高比/大小如何,都将其置于中央。
“背景”视频将始终为16:9和1920x1080px。我不知道重叠式视频的长宽比或尺寸,因为它将由用户上传,并且可以是任何尺寸/比例。
这是我要实现的目标的一个示例:
这是背景图片:
现在,我想在顶部覆盖视频:
本质上,无论我要确保将其尺寸调整为始终适合1920x1080以内的尺寸,此外还要确保其始终居中。
我正在尝试使用WebGL显示一个简单的效果.当然,这意味着我正在使用GLSL ES 1.0规范中定义的片段着色器语言.
我正在使用的代码主要是从其他来源复制的.它设置一个正方形并使用片段和顶点着色器来确定像素颜色.以下代码将只显示一个白色方块.
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
Run Code Online (Sandbox Code Playgroud)
但是,如果我将alpha分量更改为1.0
然后它将显示黑色方块.
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); // displays a black square
Run Code Online (Sandbox Code Playgroud)
我假设片段着色器输出的颜色必须与之前的颜色组合.如何确保只有最后一种颜色(不论其alpha值)是否实际被选为要显示的颜色?
或者也许我的订单错了.也许后期阶段与片段着色器中的颜色组合以产生白色.在任何情况下,我都知道正在进行某种混合,因为当我将alpha值更改为0.5时,我得到一个灰色方块.我只是想知道,白色来自哪里?我怎么摆脱它呢?
据我所知,问题与混合功能无关.该代码是在GitHub 这里.在Google Chrome或Firefox中试用.