[形色主义5]PS中图片锯齿产生原因及去除办法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[形色主义5]PS中图片锯齿产生原因及去除办法相关的知识,希望对你有一定的参考价值。

参考技术A   我们在处理图片或制作图形的时候,很多图形刚制作的时候边缘是光滑的,等稍微变形或者缩小的时候就出现了锯齿。因为PS是位图,不能像矢量图那样缩放自如。如果发现有锯齿,下面的教程会详细分析原因及解决锯齿问题。

(一)ctrl+t 类变形导致的锯齿问题

解决办法1 :改变常规选项设置。打开菜单 [编辑]-[首选项]-[常规]。请确保你的[图像插值]设置为“两次立方(适用于平滑渐变)。

解决办法2 :先旋转后缩小,分两步走(把一次ctrl+t 拆分为两次,最后一次再缩小可以减少变形/旋转产生的毛刺)。

解决办法3 :采用矢量对象(比如常见的文字透视变形,不要选择[栅格化]。矢量对象在一般情况下变形更保真,另一个显著优点是经得起反复ctrl+t 而不会产生问题。

解决办法4 :要想最大程度保持原样,最好在90度(180度)旋转时用角点定位(随便哪个角点)。这样可以避免重新运算像素导致的质量损失。

(二)多次填充选区产生的锯齿问题

反复的填充(包括涂画、拉渐变等等)导致原本用于平滑的边缘半透明像素叠加,越来越不透明产生实体锯齿。

解决办法1 :填充一次后,立即锁定图层的透明区域。这样你再怎么填充,边缘都不会变实。

解决办法2 :用不透明区域建立蒙版(ctrl+[缩略图]选中图层不透明区域,然后点击[图层面板]下面的添加蒙版按钮);或者使用下一图层(这个图层只填充一次,仅用以定义外形)做剪贴蒙版。由于蒙版不再改动,所以透明区域也不会变化,边缘半透明自然也不会有问题。

(三)魔棒/磁性套索 等选择工具选出的区域有锯齿

由于图片压缩等等原因产生的锯齿(jpg图片常见的矩形色块),或其他原因导致的软件区分/吸附不准确。

解决办法 :可以用[调整边缘]控制面板调整选区后再作运用。

(四)锐化过度产生的局部锯齿

解决办法 :渐隐滤镜效果。单步滤镜产生的效果都可以用消退,令使用后和使用前的效果混合。我们可以用它减弱效果,或者快速完成一些特殊的用途。

(五)选区或路径填充和描边后产生的锯齿

  在填充或描边后有时会产生明显的锯齿,而对于位图图像这必然存在,放大后看会更明显,但如果在实际图像大小的情况下看不见锯齿就算正常。那么怎么样减弱锯齿现象呢?

解决办法1 :可以在新建文件时,把分辨率设置大一些,如300像素以上。

解决办法2 :可以把文档建得比你想要的图片更大一些。

解决办法3: 选中需要调整锯齿的部分,然后用调整边缘选项来作平滑处理。

有关更多其它系列教程可关注专题:形色主义(本专题不接受投稿)

转:java.lang.IllegalStateException异常产生的原因及解决办法

问题描述:

错误类型大致为以下几种:

java.lang.IllegalStateException:Cannot forward a response that is already committed 
IllegalStateException:response already commited 
IllegalStateException:getOutputStream() has already been called for this request

错误原因:

该异常表示,当前对客户端的响应已经结束,不能在响应已经结束(或说消亡)后再向 客户端(实际上是缓冲区)输出任何内容。

具体分析:首先解释下flush(),我们知道在使用读写流的时候数据先被读入内存这个缓冲区中, 然后再写入文件,但是当数据读完时不代表数据已经写入文件完毕,因为可能还有 一部分仍未写入文件而留在内存中,这时调用flush()方法就会把缓冲区的数据强行 清空输出,因此flush()的作用就是保证缓存清空输出。 response是服务端对客户端请求的一个响应,其中封装了响应头、状态码、内容等, 服务端在把response提交到客户端之前,会向缓冲区内写入响应头和状态码,然后 将所有内容flush。这就标志着该次响应已经committed(提交)。对于当前页面中 已经committed(提交)的response,就不能再使用这个response向缓冲区写任何东西 (注:同一个页面中的response.XXX()是同一个response的不同方法,只要其中一个 已经导致了committed,那么其它类似方式的调用都会导致 IllegalStateException异常)。

【注意】能够导致响应已经committed的操作包括:forward, redirect, flushBuffer。

JDK API:

①flushBuffer

public void flushBuffer()throws IOException
Forces any content in the buffer to be written to the client. A call to this method automatically commits the response, meaning the status code and headers will be written. 

②sendRedirect

public void sendRedirect(String location)throws IOException
Sends a temporary redirect response to the client using the specified redirect location URL. This method can accept relative URLs; 
the servlet container must convert the relative URL to an absolute URL before sending the response to the client. If the location is relative without a leading
‘/‘ the container interprets it as relative to the current request URI.
If the location is relative with a leading ‘/‘ the container interprets it as relative to the servlet container root. If the response has already been committed, this method throws an IllegalStateException. After using this method, the response should be considered to be committed and should not be written to.

③forward

public void forward(ServletRequest request,ServletResponse response) throws ServletException,IOException

Forwards a request from a servlet to another resource (servlet, JSP file, or HTML file) on the server. This method allows one servlet to do preliminary processing of a request and another resource to generate the response.

For a RequestDispatcher obtained via getRequestDispatcher(), the ServletRequest object has its path elements and parameters adjusted to match the path of the target resource.

forward should be called before the response has been committed to the client (before response body output has been flushed). If the response already has been committed, this method throws an IllegalStateException.
Uncommitted output in the response buffer is automatically cleared before the forward. The request and response parameters must be either the same objects as were passed to the calling servlet
‘s service method or be subclasses of the ServletRequestWrapper or ServletResponseWrapper classes that wrap them.

备 注:注:在一次响应commit之前,所有的内容输出都将写入servlet引擎的缓冲区(tomcat或 weblogic的内容空间), 而在commit之后,上一次response向缓冲区写入的内容,将清空。 由于servlet在没有设置单线程的情况下(使用Single-Threaded Model,servlet实现 SingleThreadModel接口,jsp使用<%@ page isThreadSafe="false" %>),是多线程的,所以 上面所说的缓冲区,都将是该response所属的线程私有的内存空间。有了这个概念, 将可以分析碰到的关于servlet多线程的很多问题。 如果不能确认response是否已经committed. 可以调用response.isCommitted()来判断。 导致这个错误最普遍的原因是,jsp有编译错误。

常见解决办法:

①在response.sendRedirect()方法后加return语句即可,如下: response.sendRedirect("login.jsp"); return;

②检查提交的url是否有误。

③如果你的页面中用了清缓存代码response.flushbuffer();又用到了response.sendRedirect(url); 你可以把response.flushbuffer();去掉,或者用JS的window.location.href="url";来做转向。

④如果你用了OutputStream,而web容器生成的servlet代码中有out.write(””),这个和JSP中调用的 response.getOutputStream()冲突。

  out.write()这个是字符流,而response.getOutputStream() 是字节流,你不能在同一个页面中调用多个输出流。无论先调用哪一个,在调用第二个时都会抛出 IllegalStateException,

  因为在jsp中,out变量是通过response.getWriter得到的。在多个使用了 outputStream的<%%>语句之间不能有空格及多余的字符。

  也就是页面中除了使用了 outputStream的<%%>之外不能有空格或其它任何字符,在之内的语句可以有空格及回车。

  在JSP页面做输出的时候有两种方式.一是通过JspWriter,另一个是通过 OutputStream,但二者互相排斥.如果并存的话就会报告以上异常. 在不得不使用OutputStream的时候.我们必须要把JspWriter舍弃掉了。

  找到 请求异常的页面所对应的Servlet..把其中所有使用JspWriter的语句全部去掉. 或者是到你的JSP文件里把动态输出的代码注释掉.

  这里注意换行和空格制表符均 为JspWriter输出.应该一起去掉.保存文件重新启动服务器你会发现上述异常 消失了。

  由于jsp container在处理完成请求后会调用releasePageContet方法释放 所用的PageContext object,并且同时调用getWriter方法,

  由于getWriter方法 与在jsp页面中使用流相关的getOutputStream方法冲突,所以会造成这种异常,

  解决办法是:只需要在jsp页面的最后加上两条语句: out.clear(); out=pageContext.pushBody(); 即可(其中out,pageContext均为jsp内置对象!) 。






以上是关于[形色主义5]PS中图片锯齿产生原因及去除办法的主要内容,如果未能解决你的问题,请参考以下文章

photoshop作的图片怎么去掉边缘锯齿

求助 解决png图片 锯齿边缘 的优化

形形色色的数据

PS里图片的锯齿效果怎么做?

深度揭秘乱码问题背后的原因及解决方式

如何解决photoshop图片操作中常见的锯齿问题