final 调色之后会电视机闪屏是什么原因情况

java 2D绘画出现闪屏问题~~急
[问题点数:20分,结帖人Migu4423]
本版专家分:13
结帖率 72.73%
CSDN今日推荐
本版专家分:7774
本版专家分:11942
本版专家分:13
结帖率 72.73%
本版专家分:13
结帖率 72.73%
本版专家分:5782
本版专家分:5839
本版专家分:0
匿名用户不能发表回复!|
CSDN今日推荐视频大拍档」Final Cut Pro视频调色入门(新手向)
本期节目和大家分享一下我们在Final Cut Pro里的调色流程
在公众号回复『fcpx调整图层』获取视频中使用到的调整图层下载地址, 回复『大片lut包』下载我们提供的调色LUT文件
调色时示波器和波形图是非常重要的两个工具,不同后期软件中这两个工具都是相似的。示波器用于显示颜色分布和强度,通过增加画面的饱和度,可以明显看到示波器的各个方向的峰值变大
波形图用于显示曝光强度
波形图还有一个特点就是,它的X轴与图像的X轴是一一对应的,下图将波形图叠加到原图像上,可以看到图像的曝光强度与波形图的值一一对应。
通过分离RGB通道,观察不同通道的波形图峰值,来调整白平衡,保证各通道之间的数值分布均衡
调色的时候,显示要让不同片段拥有共同的曝光和白平衡,最后就是进行全局调色了。一个一个的调色肯定是效率很低的,调整好一个,然后复制效果到其他片段也是非常麻烦。所以能像AE,PR那样使用『调整图层adjustment layer』是会变得非常方便,可惜FCPX名没有这样的功能,只能通过插件,而还有另一种hack,就是使用空的Motion标题,回复『fcpx调整图层』即可下载使用。
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点120711强氧苹果Final Resolve电影后期制作调色系统方案-1_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
120711强氧苹果Final Resolve电影后期制作调色系统方案-1
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩7页未读,
定制HR最喜欢的简历
你可能喜欢Java解决游戏界面闪屏
一、问题描述
我们在做有关于图形绘制方面的问题非常之多。比如,有时我们用普通的方法去绘制图形,会产生闪屏的现象,导致我们所做的游戏或者是别的项目效果非常差,这完全不是我们想要的结果。那么,有没有一种技术,实现不闪屏的效果,特别是在多线程环境下。答案是有的,这就是Java的什么技术——双缓冲技术。
图1 双缓冲技术效果图
二、实现方法
1、首先,我们定义一个类继承JFrame,要自定义绘图,我们就要实现JFrame的paint()方法,如下:
public void paint(Graphics g) {
2、创建一个缓冲区画笔;
public BufferedImage(int width,
int height,
int imageType)
缓冲区的宽度
缓冲区的高度
缓冲图形模式
BufferedImage paint = new BufferedImage(width, height,
BufferedImage.TYPE_3BYTE_BGR);
Graphics g2 = paint.getGraphics();
3、将你想要绘制的图形绘制在缓冲区内;
// 将想要绘制的图形绘制到缓冲区
g2.drawImage(GameImage.getInstance().game_main_bg, 0, 0, width, height,
4、将缓冲区的图形绘制到显示面板上;
g.drawImage(paint, 0, 0, this);
经过上面四步之后,我们就解决了闪屏的问题,现在放心大胆的去做你的游戏吧!
三、项目源码
由于项目过大,源码只给出了双缓冲技术得用法,具体的实现并没有做。如果想验证源码的,可以联系我要项目所用到的图片,也可以上网查找。
由于技术和能力有限,文中难免会有错误之处,还望指正,谢谢合作!
1、程序入口类Main.java
* 主函数入口
public class Main {
public static void main(String[] args) {
new MainGameFrame();
2、游戏主界面类MainGameFrame.java
* 游戏主面板
public class MainGameFrame extends JFrame implements Runnable {
private int width = 1200;
private int height = 600;
private BufferedImage clickG
private List&PlantAutoMoveInfo& allP
private boolean isRunnableS
public MainGameFrame() {
isRunnableStart = true;
new Thread(this).start();
newPlant();
* 创造植物
private void newPlant() {
allPlant = new ArrayList&PlantAutoMoveInfo&();
PlantAutoMoveInfo plantObj = new PlantAutoMoveInfo(new Point(300, 100),
Constants.SUNFLOWER, GameImage.getInstance().sunflower);
allPlant.add(plantObj);
plantObj = new PlantAutoMoveInfo(new Point(300, 250),
Constants.SUNFLOWER, GameImage.getInstance().sunflower);
allPlant.add(plantObj);
plantObj = new PlantAutoMoveInfo(new Point(400, 100), Constants.PEA,
GameImage.getInstance().pea);
allPlant.add(plantObj);
plantObj = new PlantAutoMoveInfo(new Point(400, 250), Constants.PEA,
GameImage.getInstance().pea);
allPlant.add(plantObj);
plantObj = new PlantAutoMoveInfo(new Point(500, 100), Constants.NUT,
GameImage.getInstance().nut);
allPlant.add(plantObj);
plantObj = new PlantAutoMoveInfo(new Point(500, 250), Constants.NUT,
GameImage.getInstance().nut);
allPlant.add(plantObj);
* 绘制图像
public void paint(Graphics g) {
BufferedImage paint = new BufferedImage(width, height,
BufferedImage.TYPE_3BYTE_BGR);
Graphics g2 = paint.getGraphics();
g2.drawImage(GameImage.getInstance().game_main_bg, 0, 0, width, height,
for (PlantAutoMoveInfo obj : allPlant) {
g2.drawImage(obj.getShowImage(), (int) obj.getPos().getX(),
(int) obj.getPos().getY(), this);
g.drawImage(paint, 0, 0, this);
private void init() {
this.setTitle("植物大战僵尸");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setLocation(200, 200);
this.setSize(width, height);
this.setVisible(true);
* 当游戏界面图形变化时,我们要不断的刷新显示
public void run() {
while (isRunnableStart) {
this.repaint();
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
3、图片获取类GameImage.java
* 获取图片
public class GameImage {
public static List&BufferedImage&
public static List&BufferedImage&
public static List&BufferedImage&
public static BufferedImage game_main_
private static GameImage instance = null;
* 提供对外接口,并加上同步锁
public static GameImage getInstance() {
if(instance == null){
synchronized(GameImage.class){
if(instance == null){
instance = new GameImage();
GameImage(){
sunflower = new ArrayList&BufferedImage&();
nut = new ArrayList&BufferedImage&();
pea = new ArrayList&BufferedImage&();
game_main_bg = ImageIO.read(new File("image\\bk1.jpg"));
for(int i=1;i&=11;i++){
nut.add(ImageIO.read(new File("image\\plant\\p_3_0"+i+".png")));
if(i &= 8){
sunflower.add(ImageIO.read(new File("image\\plant\\p_1_0"+i+".png")));
pea .add(ImageIO.read(new File("image\\plant\\p_2_0"+i+".png")));
} catch (IOException e) {
e.printStackTrace();
4、植物信息保存类PlantAutoMoveInfo.java
* 植物信息业务类
public class PlantAutoMoveInfo implements Runnable{
private boolean isS
private BufferedImage showI
private int
private int
private int SUNTIME;
private int tempT
private boolean isP
private List&BufferedImage& plantI
public PlantAutoMoveInfo(Point pos,int type,List&BufferedImage& gameImage) {
this.pos =
this.plantImage = gameI
SUNTIME = Constants.PRODUCTION_SUNNING_TIME;
index = 0;
tempTime = 0;
showImage = plantImage.get(index);
this.type =
isStart = true;
isProduction = false;
new Thread(this).start();
public PlantAutoMoveInfo() {
public void stopSunflowerThread(boolean bool){
public boolean isProduction() {
return isP
public int getType() {
public void setType(int type) {
this.type =
public void setProduction(boolean isProduction) {
this.isProduction = isP
public Point getPos() {
public void setPos(Point pos) {
this.pos =
public boolean isStart() {
return isS
public void setStart(boolean isStart) {
this.isStart = isS
public BufferedImage getShowImage() {
return showI
public void setShowImage(BufferedImage showImage) {
this.showImage = showI
public int getTempTime() {
return tempT
public void setTempTime(int tempTime) {
this.tempTime = tempT
public void run() {
while(isStart){
showImage = plantImage.get(index % plantImage.size());
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
if(type == Constants.SUNFLOWER && !isProduction){
tempTime++;
if((tempTime * 150) &= SUNTIME * 1000){
isProduction = true;
6、常量类Constants.java
public class Constants {
public final static int SUNFLOWER = 0x0002;
public final static int PEA = 0x0004;
public final static int NUT = 0x0008;
public final static int PRODUCTION_SUNNING_TIME = 0;
没有更多推荐了,0栈开发,区块链应用 Bitshares布道师(自封)
这交互炸了(三):闪屏页是像云一样消失的
《交互炸了》或许是一系列高端特效教程, 文中会介绍一些比较炫酷的特效,以及实现的思路。特效实现本身也许不会有太大的难度。难点在于实现的思路。一旦思路被打开,特效将很简单实现。
效果项目地址:
本期是第三期,第二期做的比较草率,好像并不太符合“交互炸了”这一主题,所以以后我会保证质量,而不是为了跟进数量凑数。这次给大家分享的效果是一个闪屏页的效果,效果如下:
有没有眼前一亮?现在许多炫酷的闪屏页或者引导页喜欢用视频来做,但是我偏不,原因有两个:
1.视频会增加App体积,为了这一个闪屏页,多增加用户下载流量,这是很恶心的一件事情。
2.第二段云扩散融合效果,视频实现起来比较棘手。
动效制作思路发散
前面一篇跟大家分享了一写关于动画的小技巧。动画这种东西跟魔术一样,只要用户看的开心,怎么实现无所谓,所以做一些障眼法来取悦用户是没有问题的。这里的障眼法大概有如下几点:
1.View放大不是真正的放大。
2.View平移之后,可能悬浮在顶部的已经换成了一个一模一样的双胞胎View。
3.比较特殊的如上面的效果,扩散并不是View自己被扩散。
所以在做动效的时候,应该从一个魔术师的角度去考虑,而不能从用户的角度来考虑,做到思维的发散。这里可以去看看一些魔术揭秘教程~做到看起来很炫酷,原理很简单,基本上动效的思路就有啦。
WowSplash实现思路
我们先把特效分为两段,一段为描边动画。另一段为云雾扩散动画。首先来研究第一段。
第一段其实很简单,大部分小伙伴一眼就可以看出来,这就是SVG结合Path实现的动画。恩,对~你说的没错,网上有很多关于这种动画的实现,这里直接把需要的东西给到大家~
首先,你需要一张SVG图片,怎么获得呢,美工会配合我吗? 想多了,完全不需要美工大大帮忙~我们可以自己动手来。
首先需要用到一个神器: Vector Magic 他可以帮我们把普通图片转换为SVG图片。这里我就找来了一张铁塔的简笔画~ 转换之后,就可以得到SVG文件了~
其次,需要用到一个工具类,用于把SVG转换成Path.这里我直接拿了GAStudio哥的一个工具类: 接下来,我们把拿到的SVG保存在String.xml文件中待用~
接下来使用PathMeasure 来进行SVG转换后Path的绘制,具体的细节,请看源码~这里不过多阐述。
float stop = mLength * mAnimatorV
mTowerPathMeasure.getSegment(0, stop, mTowerDst, true);
canvas.drawPath(mTowerDst, mPaint);
铁塔完毕后,有点单调~ 我们来给他绘制一些云彩~ 每个云彩都是一个Path,所以画云彩只是绘制一些Path.
private void drawCould(Canvas canvas) {
for (int i = 0; i & mCouldPaths. i++) {
setupCouldPath(mCouldPaths[i], i);
canvas.drawPath(mCouldPaths[i], mPaint);
最后,加上动画~ 让他不生硬。最后暴漏一个方法,在进入Activity的时候执行,第一个阶段就完成啦~
public void startAnimate() {
restore();
getTowerValueAnimator().start();
for (int i = 0; i & mCouldPaths. i++) {
final ValueAnimator couldAnimator = getCouldValueAnimator(i);
postDelayed(new Runnable() {
@Override public void run() {
couldAnimator.start();
}, mDuration / 2);
getTitleAnimate().start();
第二阶段看起来比较炫,其实也是比较简单的,扩散不好搞,可以换一个思路嘛。所以这里我就想到使用Xfermode,没错,你看到发散的云,其实又是另一张图片:
哈哈哈哈,这张图片一贴出来,你是不是想笑。原来看起来很炫的效果,真实这么搞笑。
好的,有了思路就很好继续了。我只需要让两个图片使用Xfermode搞基一番,并且在过程中让这个View逐渐透明,遮罩图片逐渐放大即可。
当然,有了思路变成很简单,其实还是有些坑的,说说遇到的坑。
关于Xfermode小伙伴们用到过的可能了解,他有坑,非常大的坑。。经常发现与Demo图出不来一样的效果。所以我专门总结了一篇博客如下:,感兴趣的可以看下。这里再来重复下Xfermode坑如何避免。
最终大总结,如果想让PorterDuffXferMode按照预期Demo(或者效果图)的效果图像实现,必须满足以下条件:
1、关闭硬件加速。(实际为开启硬离屏缓存)
2、两个bitmap大小尽量一样。
3、背景色为透明色。
4、如果两个bitmap位置不完全一样,可能也是预期效果,只不过你看到的效果和你自己脑补的预期效果不一致。
所以,为了避免这些坑,我把View分为了两个,第一阶段是一个View,第二阶段是一个View。当第一段View执行完之后,把该View截屏,转换为bitmap交给第二个View。同时第一个View设置gone来避免过度绘制,第二个View绘制的实际上是两个bitmap,并且开启硬离屏缓存来实现Xfermode的正确效果。
setLayerType(View.LAYER_TYPE_HARDWARE, null);
mWowView.startAnimate(wowSplashView.getDrawingCache());
最后,在使用动画让第二个View从0扩大到数倍,同时改变透明度就达到我们想要的效果了。
好啦,本期《交互炸了》到此就结束了,最后附上项目地址,如果你觉得不错,欢迎star,关注我可以获得最新动态哦。
没有更多推荐了,}

我要回帖

更多关于 笔记本闪屏是什么原因 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信