来个PS高手,帮我P一张图,不失真的情况下把图片边缘图像放大不失真就行,越大越好

寻找一个PS高手,帮我p一张图片,就是把一张小一些的图片p在大一点的图片上, 寻找一个PS高手,帮我p一张图片
寻找一个PS高手,帮我p一张图片,就是把一张小一些的图片p在大一点的图片上
匿名 寻找一个PS高手,帮我p一张图片,就是把一张小一些的图片p在大一点的图片上
自定义背景里用你的大图片
把小图片放上去就行了
发图啊楼主
热心网友
无图无真相
热心网友
电脑上(DIY)ps就行。
\L丝
热心网友PS高手请进,这个怎么做,好漂亮哦!来自:
日分享至 :
下一篇:上一篇:其它类似问题相关文章相关帖子--PS高手请进,这个怎么做,好漂亮哦!1400人阅读
Android(12)
定义ImageView,实现功能如下:
1.初始化时图片垂直居中显示,拉伸图片宽度至ImageView宽度。
2.使用两根手指放大缩小图片,可设置最大放大倍数,当图片小于ImageView宽度时,在手指离开屏幕时恢复到ImageView宽度。
3.支持双击放大缩小。当图片处于未放大状态时,双击放大至指定倍数,当图片处于放大状态时,双击恢复至未放大状态。
4.图片拖动效果。当图片处于未放大状态时,不可拖动。
5.图片拖动效果。当放大后的高度不超过ImageView时,不可垂直拖动。(由于默认设置拉伸宽度至ImageView宽度,水平方向可不判断)。
6.图片拖动效果。当图片向右拖动时,若左边缘超出左边界,则停止水平拖动。同理上下右边缘,即拖动后不会看到背景留白。
Android中可以通过使用Matrix类实现图片的缩放,为了实现通过手势控制需要监听onTouch事件,所以原理简单来说就是通过监听onTouch的各种事件来控制Matrix类。其中具体控制方式如下:
ACTION_DOWN
记录初始点,设置本次模式为拖动模式,ScaleType设置成Matrix
ACTION_POINTER_DOWN
设置本次模式为缩放模式
ACTION_MOVE
根据模式执行postScale或postTranslate
根据当前缩放级别决定是否重置Matrix
ACTION_CANCEL
以下将按功能点一一说明:
1、首先创建自定义视图MatrixImageView继承自ImageView,并且添加自定义onTouch手势监听和双击手势监听。
public class MatrixImageView extends ImageView{
private final static String TAG=&MatrixImageView&;
private GestureDetector mGestureD
模板Matrix,用以初始化 */
Matrix mMatrix=new Matrix();
图片长度*/
private float mImageW
图片高度 */
private float mImageH
public MatrixImageView(Context context, AttributeSet attrs) {
super(context, attrs);
MatrixTouchListener mListener=new MatrixTouchListener();
setOnTouchListener(mListener);
mGestureDetector=new GestureDetector(getContext(), new GestureListener(mListener));
//背景设置为balck
setBackgroundColor(Color.BLACK);
//将缩放类型设置为FIT_CENTER,表示把图片按比例扩大/缩小到View的宽度,居中显示
setScaleType(ScaleType.FIT_CENTER);
2、之后重写setImageBitmap方法初始化模板以及图片的宽度和长度。
public void setImageBitmap(Bitmap bm) {
// TODO Auto-generated method stub
super.setImageBitmap(bm);
//设置完图片后,获取该图片的坐标变换矩阵
mMatrix.set(getImageMatrix());
float[] values=new float[9];
mMatrix.getValues(values);
//图片宽度为屏幕宽度除缩放倍数
mImageWidth=getWidth()/values[Matrix.MSCALE_X];
mImageHeight=(getHeight()-values[Matrix.MTRANS_Y]*2)/values[Matrix.MSCALE_Y];
3、接下来自定义监听器重写onTouch事件:当我们按下一个点时,会触发Down事件,而按下第二个点后,又会触发Action_Pointer_Down事件,在MatrixTouchListener中我们把按下一个点标记为拖动事件,按下两个点标记为缩放事件。
public class MatrixTouchListener implements OnTouchListener{
/** 拖拉照片模式 */
private static final int MODE_DRAG = 1;
/** 放大缩小照片模式 */
private static final int MODE_ZOOM = 2;
不支持Matrix */
private static final int MODE_UNABLE=3;
最大缩放级别*/
float mMaxScale=6;
双击时的缩放级别*/
float mDobleClickScale=2;
private int mMode = 0;//
缩放开始时的手指间距 */
private float mStartD
当前Matrix*/
private Matrix mCurrentMatrix = new Matrix();
/** 用于记录开始时候的坐标位置 */
private PointF startPoint = new PointF();
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
//设置拖动模式
mMode=MODE_DRAG;
startPoint.set(event.getX(), event.getY());
// isMatrixEnable();
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
reSetMatrix();
case MotionEvent.ACTION_MOVE:
if (mMode == MODE_ZOOM) {
setZoomMatrix(event);
}else if (mMode==MODE_DRAG) {
setDragMatrix(event);
case MotionEvent.ACTION_POINTER_DOWN:
if(mMode==MODE_UNABLE) return true;
mMode=MODE_ZOOM;
// 计算两个手指间的距离
mStartDis = distance(event);
return mGestureDetector.onTouchEvent(event);
3.1、在事件方法setZoomMatrix(event)中,首先我们判断是否点击了两个点,如果不是则直接返回;之后使用distance方法计算出两个点之间移动后的距离并以之计算缩放倍数,因为我规定了图片缩放的最大倍数最后还需要验证这个缩放倍数是否越界了:
设置缩放Matrix
@param event
private void setZoomMatrix(MotionEvent event) {
//只有同时触屏两个点的时候才执行
if(event.getPointerCount()&2) return;
float endDis = distance(event);// 结束距离
if (endDis & 10f) { // 两个手指并拢在一起的时候像素大于10
float scale = endDis / mStartD// 得到缩放倍数
mStartDis=endD//重置距离
mCurrentMatrix.set(getImageMatrix());//初始化Matrix
float[] values=new float[9];
mCurrentMatrix.getValues(values);
// 检验scale,使图像缩放后不会超出最大倍数
scale = checkMaxScale(scale, values);
setImageMatrix(mCurrentMatrix);
检验scale,使图像缩放后不会超出最大倍数
@param scale
@param values
private float checkMaxScale(float scale, float[] values) {
if(scale*values[Matrix.MSCALE_X]&mMaxScale)
scale=mMaxScale/values[Matrix.MSCALE_X];
mCurrentMatrix.postScale(scale, scale,getWidth()/2,getHeight()/2);
PS:为了防止经过缩放的图片小于屏幕大小,在手指离开屏幕后需要判断当前累计的缩放倍数,在当前累计的缩放倍数小于初始的倍数,需要重置缩放倍数使图片充满屏幕。方法reSetMatrix如下:
首先获取当前X轴缩放级别(由于默认拉伸宽度至ImageView宽度,缩放级别以X轴为准),再通过模板Matrix得到原始的X轴缩放级别,判断当前缩放级别是否小于模板缩放级别,若小于,则重置成模板缩放级别。
重置Matrix
private void reSetMatrix() {
if(checkRest()){
mCurrentMatrix.set(mMatrix);
setImageMatrix(mCurrentMatrix);
判断是否需要重置
当前缩放级别小于模板缩放级别时,重置
private boolean checkRest() {
// TODO Auto-generated method stub
float[] values=new float[9];
getImageMatrix().getValues(values);
//获取当前X轴缩放级别
float scale=values[Matrix.MSCALE_X];
//获取模板的X轴缩放级别,两者做比较
mMatrix.getValues(values);
return scale&values[Matrix.MSCALE_X];
3.2、在事件方法setDragMatrix(event)中,首先是通过isZoomChanged方法判断是否缩放过,若未缩放过则不可拖动(这种情况下图片全貌都可以看到,不需要拖动)。接着,拿当前坐标和按下时记录的startPoint坐标进行计算,得出拖动的距离。需要注意的是,在此需要对拖动距离做一个判断,当其小于10f时不进行拖动,否则会和双击事件冲突(在双击事件前同样会触发Move事件,两者一同执行的话,双击的缩放无法正常工作):
public void setDragMatrix(MotionEvent event) {
if(isZoomChanged()){
float dx = event.getX() - startPoint.x; // 得到x轴的移动距离
float dy = event.getY() - startPoint.y; // 得到x轴的移动距离
//避免和双击冲突,大于10f才算是拖动
if(Math.sqrt(dx*dx+dy*dy)&10f){
startPoint.set(event.getX(), event.getY());
//在当前基础上移动
mCurrentMatrix.set(getImageMatrix());
float[] values=new float[9];
mCurrentMatrix.getValues(values);
dx=checkDxBound(values,dx);
dy=checkDyBound(values,dy);
mCurrentMatrix.postTranslate(dx, dy);
setImageMatrix(mCurrentMatrix);
PS:为了防止将图片拖动至越界,当确定开始拖动的之后,先重置startPoint的坐标,接着,开始验证当前移动的位移量是否合法。以Y轴为例,首先获取ImageView高度,再通过sitImageBitmap方法中获取的图片真实高度和当前Y轴缩放级别计算出当前Y轴的显示高度。如果显示高度小于ImageView高度,表示当前显示的图片还没有ImageView高,在Y轴不需要移动都可看清全貌,Y轴位移量直接返回0。假如显示高度超过了ImageView高度,获取图片当前在Y轴的位移量(values[Matrix.MTRANS_Y]值),将其加上计算出的位移量后是否大于0,若大于0,表示图片上边缘将会离开ImageView上边缘,需要重新计算位移量。若上述条件不成立,判断当前位移量加上计算后的位移量,是否小于图片显示高度-屏幕高度,若小于表示图片下边缘将离开ImageView下边缘,同样需要重新计算。最后返回计算的Y轴偏移量。X轴同理。最后使用验证过的X、Y轴偏移量,在当前图片Matrix的基础上行进行偏移。
*和当前矩阵对比,检验dx,使图像移动后不会超出ImageView边界
@param values
private float checkDxBound(float[] values,float dx) {
float width=getWidth();
if(mImageWidth*values[Matrix.MSCALE_X]&width)
if(values[Matrix.MTRANS_X]+dx&0)
dx=-values[Matrix.MTRANS_X];
else if(values[Matrix.MTRANS_X]+dx&-(mImageWidth*values[Matrix.MSCALE_X]-width))
dx=-(mImageWidth*values[Matrix.MSCALE_X]-width)-values[Matrix.MTRANS_X];
和当前矩阵对比,检验dy,使图像移动后不会超出ImageView边界
@param values
private float checkDyBound(float[] values, float dy) {
float height=getHeight();
if(mImageHeight*values[Matrix.MSCALE_Y]&height)
if(values[Matrix.MTRANS_Y]+dy&0)
dy=-values[Matrix.MTRANS_Y];
else if(values[Matrix.MTRANS_Y]+dy&-(mImageHeight*values[Matrix.MSCALE_Y]-height))
dy=-(mImageHeight*values[Matrix.MSCALE_Y]-height)-values[Matrix.MTRANS_Y];
4、最后是双击放大缩小图片效果,该功能在手势接口GestureListener中完成,在构造函数中将onTouchListner传递来进来。在此只重写两个方法:Down和onDoubleTap,只有在Down事件中返回true,onDoubleTap才能正常触发。在onDoubleClick事件中,首先通过isZoomChanged方法判断当前的缩放级别是否是模板Matrix的缩放级别,是的话将缩放倍数设置为2倍,否的话设置成1倍。主要代码如下:
private class
GestureListener extends SimpleOnGestureListener{
private final MatrixTouchL
public GestureListener(MatrixTouchListener listener) {
this.listener=
public boolean onDown(MotionEvent e) {
//捕获Down事件
return true;
public boolean onDoubleTap(MotionEvent e) {
//触发双击事件
listener.onDoubleClick();
return true;
双击时触发
public void onDoubleClick(){
float scale=isZoomChanged()?1:mDobleClickS
mCurrentMatrix.set(mMatrix);//初始化Matrix
mCurrentMatrix.postScale(scale, scale,getWidth()/2,getHeight()/2);
setImageMatrix(mCurrentMatrix);
判断缩放级别是否是改变过
true表示非初始值,false表示初始值
private boolean isZoomChanged() {
float[] values=new float[9];
getImageMatrix().getValues(values);
//获取当前X轴缩放级别
float scale=values[Matrix.MSCALE_X];
//获取模板的X轴缩放级别,两者做比较
mMatrix.getValues(values);
return scale!=values[Matrix.MSCALE_X];
最后贴下完整代码。(DEMO地址:)
package com.linj.album.
import android.content.C
import android.graphics.B
import android.graphics.C
import android.graphics.M
import android.graphics.PointF;
import android.util.AttributeS
import android.util.L
import android.view.GestureD
import android.view.GestureDetector.SimpleOnGestureL
import android.view.MotionE
import android.view.V
import android.widget.ImageV
* @ClassName: MatrixImageView
* @Description:
带放大、缩小、移动效果的ImageView
* @author LinJ
上午11:15:07
public class MatrixImageView extends ImageView{
private final static String TAG=&MatrixImageView&;
private GestureDetector mGestureD
模板Matrix,用以初始化 */
Matrix mMatrix=new Matrix();
图片长度*/
private float mImageW
图片高度 */
private float mImageH
public MatrixImageView(Context context, AttributeSet attrs) {
super(context, attrs);
MatrixTouchListener mListener=new MatrixTouchListener();
setOnTouchListener(mListener);
mGestureDetector=new GestureDetector(getContext(), new GestureListener(mListener));
//背景设置为balck
setBackgroundColor(Color.BLACK);
//将缩放类型设置为FIT_CENTER,表示把图片按比例扩大/缩小到View的宽度,居中显示
setScaleType(ScaleType.FIT_CENTER);
public void setImageBitmap(Bitmap bm) {
// TODO Auto-generated method stub
super.setImageBitmap(bm);
//设置完图片后,获取该图片的坐标变换矩阵
mMatrix.set(getImageMatrix());
float[] values=new float[9];
mMatrix.getValues(values);
//图片宽度为屏幕宽度除缩放倍数
mImageWidth=getWidth()/values[Matrix.MSCALE_X];
mImageHeight=(getHeight()-values[Matrix.MTRANS_Y]*2)/values[Matrix.MSCALE_Y];
public class MatrixTouchListener implements OnTouchListener{
/** 拖拉照片模式 */
private static final int MODE_DRAG = 1;
/** 放大缩小照片模式 */
private static final int MODE_ZOOM = 2;
不支持Matrix */
private static final int MODE_UNABLE=3;
最大缩放级别*/
float mMaxScale=6;
双击时的缩放级别*/
float mDobleClickScale=2;
private int mMode = 0;//
缩放开始时的手指间距 */
private float mStartD
当前Matrix*/
private Matrix mCurrentMatrix = new Matrix();
/** 用于记录开始时候的坐标位置 */
private PointF startPoint = new PointF();
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
//设置拖动模式
mMode=MODE_DRAG;
startPoint.set(event.getX(), event.getY());
isMatrixEnable();
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
reSetMatrix();
case MotionEvent.ACTION_MOVE:
if (mMode == MODE_ZOOM) {
setZoomMatrix(event);
}else if (mMode==MODE_DRAG) {
setDragMatrix(event);
case MotionEvent.ACTION_POINTER_DOWN:
if(mMode==MODE_UNABLE) return true;
mMode=MODE_ZOOM;
mStartDis = distance(event);
return mGestureDetector.onTouchEvent(event);
public void setDragMatrix(MotionEvent event) {
if(isZoomChanged()){
float dx = event.getX() - startPoint.x; // 得到x轴的移动距离
float dy = event.getY() - startPoint.y; // 得到x轴的移动距离
//避免和双击冲突,大于10f才算是拖动
if(Math.sqrt(dx*dx+dy*dy)&10f){
startPoint.set(event.getX(), event.getY());
//在当前基础上移动
mCurrentMatrix.set(getImageMatrix());
float[] values=new float[9];
mCurrentMatrix.getValues(values);
dx=checkDxBound(values,dx);
dy=checkDyBound(values,dy);
mCurrentMatrix.postTranslate(dx, dy);
setImageMatrix(mCurrentMatrix);
判断缩放级别是否是改变过
true表示非初始值,false表示初始值
private boolean isZoomChanged() {
float[] values=new float[9];
getImageMatrix().getValues(values);
//获取当前X轴缩放级别
float scale=values[Matrix.MSCALE_X];
//获取模板的X轴缩放级别,两者做比较
mMatrix.getValues(values);
return scale!=values[Matrix.MSCALE_X];
和当前矩阵对比,检验dy,使图像移动后不会超出ImageView边界
@param values
private float checkDyBound(float[] values, float dy) {
float height=getHeight();
if(mImageHeight*values[Matrix.MSCALE_Y]&height)
if(values[Matrix.MTRANS_Y]+dy&0)
dy=-values[Matrix.MTRANS_Y];
else if(values[Matrix.MTRANS_Y]+dy&-(mImageHeight*values[Matrix.MSCALE_Y]-height))
dy=-(mImageHeight*values[Matrix.MSCALE_Y]-height)-values[Matrix.MTRANS_Y];
*和当前矩阵对比,检验dx,使图像移动后不会超出ImageView边界
@param values
private float checkDxBound(float[] values,float dx) {
float width=getWidth();
if(mImageWidth*values[Matrix.MSCALE_X]&width)
if(values[Matrix.MTRANS_X]+dx&0)
dx=-values[Matrix.MTRANS_X];
else if(values[Matrix.MTRANS_X]+dx&-(mImageWidth*values[Matrix.MSCALE_X]-width))
dx=-(mImageWidth*values[Matrix.MSCALE_X]-width)-values[Matrix.MTRANS_X];
设置缩放Matrix
@param event
private void setZoomMatrix(MotionEvent event) {
//只有同时触屏两个点的时候才执行
if(event.getPointerCount()&2) return;
float endDis = distance(event);// 结束距离
if (endDis & 10f) { // 两个手指并拢在一起的时候像素大于10
float scale = endDis / mStartD// 得到缩放倍数
mStartDis=endD//重置距离
mCurrentMatrix.set(getImageMatrix());//初始化Matrix
float[] values=new float[9];
mCurrentMatrix.getValues(values);
scale = checkMaxScale(scale, values);
setImageMatrix(mCurrentMatrix);
检验scale,使图像缩放后不会超出最大倍数
@param scale
@param values
private float checkMaxScale(float scale, float[] values) {
if(scale*values[Matrix.MSCALE_X]&mMaxScale)
scale=mMaxScale/values[Matrix.MSCALE_X];
mCurrentMatrix.postScale(scale, scale,getWidth()/2,getHeight()/2);
重置Matrix
private void reSetMatrix() {
if(checkRest()){
mCurrentMatrix.set(mMatrix);
setImageMatrix(mCurrentMatrix);
判断是否需要重置
当前缩放级别小于模板缩放级别时,重置
private boolean checkRest() {
// TODO Auto-generated method stub
float[] values=new float[9];
getImageMatrix().getValues(values);
//获取当前X轴缩放级别
float scale=values[Matrix.MSCALE_X];
//获取模板的X轴缩放级别,两者做比较
mMatrix.getValues(values);
return scale&values[Matrix.MSCALE_X];
判断是否支持Matrix
private void isMatrixEnable() {
//当加载出错时,不可缩放
if(getScaleType()!=ScaleType.CENTER){
setScaleType(ScaleType.MATRIX);
mMode=MODE_UNABLE;//设置为不支持手势
计算两个手指间的距离
@param event
private float distance(MotionEvent event) {
float dx = event.getX(1) - event.getX(0);
float dy = event.getY(1) - event.getY(0);
/** 使用勾股定理返回两点之间的距离 */
return (float) Math.sqrt(dx * dx + dy * dy);
双击时触发
public void onDoubleClick(){
float scale=isZoomChanged()?1:mDobleClickS
mCurrentMatrix.set(mMatrix);//初始化Matrix
mCurrentMatrix.postScale(scale, scale,getWidth()/2,getHeight()/2);
setImageMatrix(mCurrentMatrix);
private class
GestureListener extends SimpleOnGestureListener{
private final MatrixTouchL
public GestureListener(MatrixTouchListener listener) {
this.listener=
public boolean onDown(MotionEvent e) {
//捕获Down事件
return true;
public boolean onDoubleTap(MotionEvent e) {
//触发双击事件
listener.onDoubleClick();
return true;
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return super.onSingleTapUp(e);
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
super.onLongPress(e);
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
return super.onScroll(e1, e2, distanceX, distanceY);
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
return super.onFling(e1, e2, velocityX, velocityY);
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
super.onShowPress(e);
public boolean onDoubleTapEvent(MotionEvent e) {
// TODO Auto-generated method stub
return super.onDoubleTapEvent(e);
public boolean onSingleTapConfirmed(MotionEvent e) {
// TODO Auto-generated method stub
return super.onSingleTapConfirmed(e);
PS:当该ImageView在其他ViewGroup中如ViewPager中时,Move事件会和ViewGroup事件冲突导致在划屏进行ImageView的拖动时,Viewpager将会通过onInterceptTouchEvent方法拦截掉,返回给ImageView一个Cancel事件,这种情况下需要重写ViewGroup的onInterceptTouchEvent方法(这将在下一篇文章中说明)。
原文地址:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:63873次
积分:1115
积分:1115
排名:千里之外
原创:56篇
转载:21篇
(20)(14)(3)(1)(4)(1)(4)(4)(4)(1)(2)(6)(1)(1)(1)(1)(3)(1)(2)(1)(2)老人有些困倦,将双脚伸进了炉堂取暖。
哪知气温骤降,海浪一波波往上冲刷着车辆。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  相信很多人在工作以及和别人交流的时候都会遇到这样的情况:想找一张分辨率足够大,清晰度足够好的图片放在文章或者网站中时,却发现找遍全网也只能找到一张分辨率很低的小图,根本没法使用。如果只是在QQ上聊聊也就罢了,但要是放在微信这种平台上,一些小图原本质量不佳,再经压缩,就基本没法看了。
  或许有人会说:遇到这种事那就重新找图呗!但是要真就找不到呢?与其浪费不短的时间去找一张很有可能找不到的高分辨率图,还不如自己动手想想办法将小图放大。下面笔者就教大家三种办法将低分辨率小图放大,这其中当然有相当专业靠谱的方法,同时也有无需工具不花时间的懒人方法,到底哪种方法适合你?这就看你对图片的精度要求了!
  最懒的方法:直接拉伸小图截取
  简易程度:★★★★★
  图片质量:★
  适用人群:只需要图片尺寸不需要精度的懒人
  特别说明:各种图片极速通吃,但放大后质量惨不忍睹
  对于懒人而言,特别是那种对图片质量毫无要求,只求图片够大的懒人,对小图最佳的处理方式自然将就原有分辨率直接拉大图片了。拉大图片的方法很多,比如把小图片放在画图工具中,将Ctrl按住滚动鼠标,就能直接调整图片的大小,这个时候再用截图工具将放大的整张图片截取下来即可;或者在Window照片查看器中将低分辨率小图放大,然后开着QQ用Ctrl+Alt+A直接截图也可以,还顺带加入了复制功能,要用到什么地方直接Ctrl+V粘贴上去就行了,方便到爆!
  在画图这类工具中将小图片拉大轻而易举,然后截图就行,不过质量嘛……
  这种什么都不改变,只拉大图片尺寸的方式的确没任何技术含量,最关键的是效果还不好,分辨率不改直接拉大的后果就是图片毫无精细度可言,重影、马赛克、色斑数不胜数,当然更不用说锐度和清晰度了。这类图片也就放大让人看个大概了,如果要拉到较大的尺寸再看细节,基本就是马赛克了……
  范例演示
  直接由原小图拉伸尺寸的图片效果
  原图片分辨率为200&200,直接不更改分辨率拉伸两倍尺寸,拉伸后的图片已经模糊不清,没有任何细节可言,边缘处出现重影、锯齿、色斑。此类图片几乎不能用于工作环境和各类图文发布平台。
  较简单的方法:使用PS等工具提升像素值和DPI
  简易程度:★★★★
  图片质量:★★
  适用人群:在放大图片同时对质量略有要求的人
  特别说明:适合各类图片,质量比直接拉伸强,图片大小剧增
  当然,对于大多数需要放大图片的人而言,直接拉伸显然不是一个理想的方式。其实将图片放大还能保持精度,一般而言,大家还是习惯用传统的软件去尝试,比如PS以及画图这样的常见软件,都可以将提升图片的分辨率,比如将一个640&480的图片提升到。方法也很简单,以画图为例,将图片载入后,选择重新调整大小,然后在像素中自行更改即可。
  画图软件中直接选择调整大小中的像素值即可
  如果是用PS软件的话,基本步骤和画图也差不多。载入图片后,在“图像”一栏中选择画像大小,然后就可以更改图片的像素了。除了基本的像素值外,PS还可以调整图片的DPI值,DPI越高,每英寸像素点越多,图像相应也就更清晰。如果不考虑像素值,直接调高DPI的话,那么图片的尺寸和像素值会自动扩展,不受用户自己控制;如果单独调整像素值,DPI值是不会自动变的。两相比较,显然直接更改DPI值的图像质量会更高。
  PS软件不但可以调整像素值,也能调整DPI(每英寸像素值,也就是“分辨率”项)
  这里可以教大家一个小窍门,如果想将一个低分辨率图片提升到一定的高分辨率,那么建议先在PS中将图片的DPI值设为300,这样像素值虽然会自动扩展,但是用户也可以随后再手动更改像素值,这样DPI依然会保持300不变。
  用软件提升图片分辨率的方法,一来是比较简单,稍微有点软件知识就能搞定;二来相比直接拉伸图片那种粗暴的方式,采用软件提升图片分辨率,在画质上要好得多。即使是直接提升图片像素值,效果也比拉伸要强不少;如果是提升了图片的DPI,效果又要比直接更改像素值好出不少。
  当然用PS这类软件提升图片分辨率也不是完美无缺的。PS的方式是采用插值运算,所以它在画质上要远比拉伸图片要强得多,但是图片上依然有可见的噪点,图片的锐度颜色损失也不小,图片上的物体边缘也略有重影和毛刺。另外,这种提升模式会让图片的大小很明显地膨胀,一张大小为90KB的640&480(72DPI)的图片,如果将其分辨率提升为(300DPI),那么它的图片大小几乎是没有修改前的十倍,超过了850KB。
  范例演示
  上图为原分辨率460&420图片的放大局部图,下图为把图片用PS提升分辨率至后的相同放大局部图,可见PS提升分辨率的效果比直接拉伸要好太多
  原图片分辨率为460&420,将其利用PS软件把分辨率提升到,同时DPI由72提升到300。图片在尺寸变大的同时,清晰度基本可以让大多数人接受,基本上也能用于各种图文平台以及工作场景中,当然在采用这类方法后,图片放大后依然有明显的模糊感,边缘的重影以及图片的噪点还是很严重。
  最好的方法:采用Waifu2&这样冷门但有效的软件
  简易程度:★★★
  图片质量:★★★★★
  适用人群:对图片放大后精度要求很高的人
  特别说明:特别适合动漫图片,有NVIDIA显卡最佳
  采用PS的软件来提升分辨率效果只能说还将就,肯定谈不上优质,如果用户是一个PS高手,利用一些PS的技巧,还可以将图片的清晰度再提升一些。但是想用PS想要提升低分辨率图片的尺寸,同时还要有很高的精度,相信哪怕是高手都要头疼,何况我们主要还是图个方便……那有没有什么很简单的办法在提升图片分辨率的同时,还能保有非常高的精度呢?答案是肯定的,这里就要介绍来自岛国的一款软件:Waifu&2。
  Waifu&2这款软件的目的很简单,就是将图片放大且保有画质。软件的下载很方便,用户可自行在网络上搜索,这里就不提供地址了。这个软件虽说是日本人制作的,但很贴心地设置了繁体中文,使用起来不成问题(不知道为什么选择简体中文结果显示是英文……)。
  Waifu&2的软件界面
  Waifu&2的菜单很简单,因为功能单一,所以操作起来并不复杂,选择要放大的图片,然后选择转换质量和放大倍数,然后点击运行即可,放大后的图片直接会出现在原有图片的文件夹中。这里有几点建议,首先为了保证输出质量,图片转换格式默认设置为PNG就可以了,图片输出的色深可以选择8bit也可以选择16bit,16bit看上去会更好一些,当然转换速度也会慢一些;其次在转换质量方面,默认选择降噪和放大即可,降噪水平可自行调整,降噪幅度越大,锐度相对会降低一些,这和电视的降噪效果比较接近;最后在放大比率方面,可以自行选择,没有限制,但是倍数越大,图片大小也越大,同时转换速度也越慢。
  有NVIDIA显卡就一定要选择CUDA
  Waifu&2对硬件有一定要求,用户最好是采用一块NVIDIA显卡,这样Waifu&2可以通过NVIDIA的CUDA进行运算,转换图片的速度就非常快;如果没有NVIDIA显卡,Waifu&2就会利用处理器进行图片转换,那速度就非常慢了。
  从实际的效果而言,Waifu&2显然是图片放大且保有画质的最好选择,不过它也是有一定限制的,并非完美。Waifu&2的工作原理是通过神经网络,针对漫画特殊的线条、颜色、网点等特点,做了特殊的算法调整(放弃了色彩渐变、强化了线条等)。所以Waifu&2主要是针对二次元动漫图片优化,兼顾照片,在动漫图片上它的放大效果非常出色,虽然锐度方面有一定缺失,但是色彩保留较好,图片边缘也不会有毛刺和重影,更重要的是影响画质的噪点基本在放大的图片上看不出来。而在照片方面,Waifu&2也有一定的优化效果,但不如动漫图片这样明显,特别是场景较为复杂的照片,Waifu&2优化起来就相对比较吃力。但即使如此,Waifu&2整体而言对图片的放大效果也比PS等软件强,哪怕在一些不是动漫的照片中,使用Waifu&2放大后,也能有效降低噪点和锯齿。如果是放大普通照片,个人建议用户应该同时尝试一下PS和Waifu&2的效果,谁的观感更好就用谁……
  范例演示
  上图为400&300分辨率的动漫图拉伸,下图是Waifu&2对原图放大4倍后的效果,放大后依然保留了非常出色的画质和色彩,没有噪点和重影,只是边缘锐度略有欠缺
  上图为290&330的非动漫图片拉伸,下图采用Waifu&2对原图放大4倍,放大后清晰度还是不错,噪点几乎没有,但是锐度、纹理丢失比较严重,有点过分磨皮的观感
  Waifu&2对于动漫图片的转换几乎可以说是完美,将小图片放大后,无论是色彩、细节、边缘的效果都很出色,略微缺失的锐度基本不影响我们的观感。但是相同软件作用于普通图片上,效果就要差多了,由于没有色彩渐变过渡,所以普通图片转换放大后看上去虽然清晰度尚可,噪点也几乎没有,但过于朦胧了一些,纹理和锐度有很大的缺失,相对PS而言,视觉感受更为柔和但过于干净而不真实。
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
科技资深评测自媒体人,带给你新鲜资讯
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:

我要回帖

更多关于 照片放大不失真软件 的文章

 

随机推荐