精华内容
下载资源
问答
  • 适用于移动端网页上传裁剪图片功能插件,
  • 效果描述: 非常适合移动网页图片上传裁剪效果 缺点就是调用的js文件比较多 使用方法: 1、将CSS样式拷贝到你的网页中 2、将body中需要的代码部分拷贝到你需要的地方即可
  • 一个在移动端网页可自由拖动旋转放大缩小按比例裁剪图片的插件,可直接拍照或者选择文件上传,亲测可行,代码模板已写好,可按照格式稍稍修改就可直接使用
  • 效果描述: 非常适合移动网页图片上传裁剪效果 缺点就是调用的js文件比较多 使用方法: 1、将CSS样式拷贝到你的网页中 2、将body中需要的代码部分拷贝到你需要的地方即可
  • 本例使用php+h5+canvas+jcrop 实现网页上传图片并对原图等比缩放后进行裁剪。实现过程:在HTML中对图片进行上传,在图片文件还未上传至服务器仍停留在form表单时,对该文件进行处理,在此过程中先获取原图的64位base...
  • 上传图片,相册和拍照,获取照片后裁剪:PicCutDemoActivity.java package com.superspace; import java.io.File; import android.app.Activity; import android.app.AlertDialog; import android.content....
    上传图片,相册和拍照,获取照片后裁剪:PicCutDemoActivity.java
    package com.superspace;
    
    
    import java.io.File;
    
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.Drawable;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    
    
    /**
     * @Title: PicCutDemoActivity.java
     * @Package com.superspace
     * @Description: 图片裁剪功能测试
     * @author SuperSpace
     */
    public class PicCutDemoActivity extends Activity implements OnClickListener {
    
    
     private ImageButton ib = null;
     private ImageView iv = null;
     private Button bt = null;
     private String tp = null;
    
    
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     // 初始化
     init();
     }
    
    
     /**
     * 初始化方法实现
     */
     private void init() {
     bt = (Button) findViewById(R.id.bt);
     ib = (ImageButton) findViewById(R.id.ib);
     iv = (ImageView) findViewById(R.id.iv);
    
    
     bt.setOnClickListener(this);
     ib.setOnClickListener(this);
     iv.setOnClickListener(this);
     }
    
    
     /**
     * 控件点击事件实现 因为有朋友问不同控件的背景图裁剪怎么实现, 我就在这个地方用了三个控件,只为了自己记录学习 大家觉得没用的可以跳过啦
     */
     public void onClick(View v) {
     switch (v.getId()) {
     case R.id.bt:
     ShowPickDialog();
     break;
     case R.id.ib:
     ShowPickDialog();
     break;
     case R.id.iv:
     ShowPickDialog();
     break;
    
    
     default:
     break;
     }
     }
    
    
     /**
     * 选择提示对话框
     */
     private void ShowPickDialog() {
     new AlertDialog.Builder(this)
     .setTitle("设置头像...")
     .setNegativeButton("相册", new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int which) {
     dialog.dismiss();
     /**
     * 刚开始,我自己也不知道ACTION_PICK是干嘛的,后来直接看Intent源码,
     * 可以发现里面很多东西,Intent是个很强大的东西,大家一定仔细阅读下
     */
     Intent intent = new Intent(Intent.ACTION_PICK, null);
    
    
     /**
     * 下面这句话,与其它方式写是一样的效果,如果:
     * intent.setData(MediaStore.Images
     * .Media.EXTERNAL_CONTENT_URI);
     * intent.setType(""image/*");设置数据类型
     * 如果朋友们要限制上传到服务器的图片类型时可以直接写如
     * :"image/jpeg 、 image/png等的类型"
     */
     intent.setDataAndType(
     MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
     "image/*");
     startActivityForResult(intent, 1);
     }
     })
     .setPositiveButton("拍照", new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int whichButton) {
     dialog.dismiss();
     /**
     * 下面这句还是老样子,调用快速拍照功能,至于为什么叫快速拍照,大家可以参考如下官方
     * 文档,you_sdk_path/docs/guide/topics/media/camera.html
     * 我刚看的时候因为太长就认真看,其实是错的,这个里面有用的太多了,所以大家不要认为
     * 官方文档太长了就不看了,其实是错的
     */
     Intent intent = new Intent(
     MediaStore.ACTION_IMAGE_CAPTURE);
     // 下面这句指定调用相机拍照后的照片存储的路径
     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
     .fromFile(new File(Environment
     .getExternalStorageDirectory(),
     "superspace.jpg")));
     startActivityForResult(intent, 2);
     }
     }).show();
     }
    
    
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     switch (requestCode) {
     // 如果是直接从相册获取
     case 1:
     startPhotoZoom(data.getData());
     break;
     // 如果是调用相机拍照时
     case 2:
     File temp = new File(Environment.getExternalStorageDirectory()
     + "/superspace.jpg");
     startPhotoZoom(Uri.fromFile(temp));
     break;
     // 取得裁剪后的图片
     case 3:
     /**
     * 非空判断大家一定要验证,如果不验证的话, 在剪裁之后如果发现不满意,要重新裁剪,丢弃
     * 当前功能时,会报NullException,只 在这个地方加下,大家可以根据不同情况在合适的 地方做判断处理类似情况
     * 
     */
     if (data != null) {
     setPicToView(data);
     }
     break;
     default:
     break;
    
    
     }
     super.onActivityResult(requestCode, resultCode, data);
     }
    
    
     /**
     * 裁剪图片方法实现
     * 
     * @param uri
     */
    
    
     public void startPhotoZoom(Uri uri) {
     /*
     * 至于下面这个Intent的ACTION是怎么知道的,大家可以看下自己路径下的如下网页
     * yourself_sdk_path/docs/reference/android/content/Intent.html
     * 直接在里面Ctrl+F搜:CROP ,之前没仔细看过,其实安卓系统早已经有自带图片裁剪功能, 是直接调本地库的
     */
     Intent intent = new Intent("com.android.camera.action.CROP");
     intent.setDataAndType(uri, "image/*");
     // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
     intent.putExtra("crop", "true");
     // aspectX aspectY 是宽高的比例
     intent.putExtra("aspectX", 1);
     intent.putExtra("aspectY", 1);
     // outputX outputY 是裁剪图片宽高
     intent.putExtra("outputX", 150);
     intent.putExtra("outputY", 150);
     intent.putExtra("return-data", true);
     startActivityForResult(intent, 3);
     }
    
    
     /**
     * 保存裁剪之后的图片数据
     * 
     * @param picdata
     */
     private void setPicToView(Intent picdata) {
     Bundle extras = picdata.getExtras();
     if (extras != null) {
     Bitmap photo = extras.getParcelable("data");
     Drawable drawable = new BitmapDrawable(photo);
    
    
     /**
     * 下面注释的方法是将裁剪之后的图片以Base64Coder的字符方式上 传到服务器,QQ头像上传采用的方法跟这个类似
     */
    
    
     /*
     * ByteArrayOutputStream stream = new ByteArrayOutputStream();
     * photo.compress(Bitmap.CompressFormat.JPEG, 60, stream); byte[] b
     * = stream.toByteArray(); // 将图片流以字符串形式存储下来
     * 
     * tp = new String(Base64Coder.encodeLines(b));
     * 这个地方大家可以写下给服务器上传图片的实现,直接把tp直接上传就可以了, 服务器处理的方法是服务器那边的事了,吼吼
     * 
     * 如果下载到的服务器的数据还是以Base64Coder的形式的话,可以用以下方式转换 为我们可以用的图片类型就OK啦...吼吼
     * Bitmap dBitmap = BitmapFactory.decodeFile(tp); Drawable drawable
     * = new BitmapDrawable(dBitmap);
     */
     ib.setBackgroundDrawable(drawable);
     iv.setBackgroundDrawable(drawable);
     }
     }
    
    
    }  
    main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView 
        android:id ="@+id/test01" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"
        />
    <Button
        android:id="@+id/bt"
          android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="获取图片"
        />
    <ImageButton
        android:id="@+id/ib"
          android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:background="@drawable/ic_launcher"
        />
    <ImageView android:id="@+id/iv"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:background="@drawable/ic_launcher"/>
    
    
    </LinearLayout>

    转载于:https://my.oschina.net/longcnway/blog/727238

    展开全文
  • uni-app实现图片上传裁剪

    万次阅读 热门讨论 2019-09-02 19:45:20
    uni-app实现图片上传裁剪 uni-app 实现图片上传裁剪,插件市场上已经有作者提供了相关的插件。这里主要介绍下我在自己开发图片上传裁剪过程中遇到的一些问题。 图片上传 图片上传功能比较简单,uni-app...

    uni-app实现图片的上传和裁剪

    uni-app 实现图片的上传和裁剪,插件市场上已经有作者提供了相关的插件。这里主要介绍下我在自己开发图片上传和裁剪过程中遇到的一些问题。

    图片上传

    图片上传功能比较简单,uni-app官方提供了完整的API介绍和案列。但是在使用过程中有几个问题要注意。

    1. 通过uni.chooseImage可以从本地或者相机中选择一张至多张照片(具体参数设置见官网说明)uni.chooseimage
    2. sizeType 设置为压缩时 仅对jpg格式的图片有效。且当一次操作多张图片时,某些图片可能会丢失压缩效果。压缩比不可更改,微信小程序只能在手机上看到压缩效果,微信开发者工具无效。(其它平台未测试)
    3. 由于问题2图片压缩问题,建议在上传图片至服务器时先调用uni.compressImage方法压缩图片。同理微信小程序仅可压缩jpg格式图片。改方法微信开发者工具无效,仅真机调试有效果

    图片裁剪

    关于图片裁剪,网上有许多五花八门的方法。但是实现的核心都是利用canvas画布。
    关于这方面的介绍推荐几个我浏览过的比较靠谱的博客:
    uniApp实现选择图片裁剪设置用户头像
    小程序的填坑小技巧之Canvas
    微信小程序 canvas 实现图片拉伸、压缩与裁剪
    canvas裁剪原理
    原生js+canvas实现裁剪图片的功能
    以上几篇文章基本上将图片裁剪的原理和方法将的比较透彻了,下面我主要记录一下我在实现上遇到的一些问题。

    参考组件

    我参考的是插件市场上可以拖动缩放的头像截取组件
    但是我要强调一点,该组件有很多坑,给我的感觉像是一个半成品,里面有很多方法都存在问题或者说是版本更新带来的问题,大家慎用。我才用他的原因是因为作者才用了可拖动区域来实现裁剪,给我的感觉是比其他方法操作体验更好。

    两个错误的方法

    1. uni.createCanvasContex该接口需要传递第二个参数this,具体使用方法:let ctx = uni.createCanvasContext("picture-canvas",this);
    2. uni.canvasToTempFilePath同样需要第二个参数this,使用方法:uni.canvasToTempFilePath({ },this)
    3. other :作者在组件的methods定义两个方法onShow和onHide和页面的生命周期函数命名冲突,需要换个名称。
      过段时间,代码优化完成之后再贴代码!

    2021-09-18 更新

    代码来了

    不好意思,最近看到有网页评论留言才发现之前说的贴代码的事情一直没有补,我在uni插件市场上传了图片截取组件属性和参数文档里都说的比较清楚,大家可以直接使用,需要参考源码的可以直接获取实例代码到本地打开,里面的一些关键代码都做了注释,有什么不明白的可评论区留言一起交流。


    (完)

    展开全文
  • HTML5移动端图片裁剪头像上传,代码可以实现手机拍照和本地图片上传,头像截取。
  • cropper.js 实现HTML5 裁剪图片上传(裁剪上传头像

    千次下载 热门讨论 2016-08-25 19:56:15
    新的版本地址:https://download.csdn.net/download/qq727013465/18240928 使用cropper.js裁剪图片,通过canvas获取裁剪后的图片,获取的是base64图片上传
  • 2.将图片传入后台:用户选择图片的时候选择的是各种各样的,但是我们的网页显示图片大小是有限的,所以我们就要在用户选择图片之后将图片添加到后台进行压缩,压缩成我们想要的大小,之后再显示到页面才好 ...
  • 图片上传的文件流我上一篇博客写了,这一篇我们说一下base64... 用户头像上传我们首先要获得图片的url然后再裁剪图片,然后把裁剪后的图片转换成base64然后在上传; 下边是安卓端代码: 首先我们要获得裁剪后的图

            图片上传的文件流我上一篇博客写了,这一篇我们说一下base64,base64上传方式就是将图片转换成base64码,然后把base64码以字符串的方式上传,然后服务器接收到以后再解码就可以了,相对于文件流来说比较简单;

               用户头像上传我们首先要获得图片的url然后再裁剪图片,然后把裁剪后的图片转换成base64然后在上传;

    下边是安卓端代码:

    首先我们要获得裁剪后的图片;一,选择图片;

    代码如下,通过对话框选择获得图片的方式;

    activity:

    /*
    * 提示对话框
    */
    private void ShowPickDialog() {
    new AlertDialog.Builder(this)
    .setTitle("设置头像")
    .setNegativeButton("相册", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    // 获取图片
    Intent intent = new Intent(Intent.ACTION_PICK, null);
    intent.setDataAndType(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    "image/*");
    startActivityForResult(intent, 1);
    }
    })
    .setPositiveButton("拍照", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
    dialog.dismiss();
    // 调用拍照
    Intent intent = new Intent(
    MediaStore.ACTION_IMAGE_CAPTURE);
    // 下面这句指定调用相机拍照后的照片存储的路径文件名用电话代替
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
    .fromFile(new File(Environment
    .getExternalStorageDirectory(),
    userphone + ".jpg")));
    startActivityForResult(intent, 2);
    }
    }).show();
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    // 如果是直接从相册获取
    case 1:
    startPhotoZoom(data.getData());

    break;
    // 如果是调用相机拍照时
    case 2:
    File temp = new File(Environment.getExternalStorageDirectory()
    + "/" + userphone + ".jpg");
    startPhotoZoom(Uri.fromFile(temp));
    break;
    // 取得裁剪后的图片
    case 3:
    /*
    * 非空判断大家一定要验证,如果不验证的话,

    *在剪裁之后如果发现不满意,要重新裁剪,丢弃  当前功能时,会报NullException,
    */
    if (data != null) {
    setPicToView(data);
    }
    break;
    default:
    break;


    }
    super.onActivityResult(requestCode, resultCode, data);
    }


    // 裁剪图片方法实现
    public void startPhotoZoom(Uri uri) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
    intent.putExtra("crop", "true");
    // aspectX aspectY 是宽高的比例
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    // outputX outputY 是裁剪图片宽高
    intent.putExtra("outputX", 300);
    intent.putExtra("outputY", 300);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 3);
    }


    /*
    * 保存裁剪之后的图片数据 
    */
    private void setPicToView(Intent picdata) {
    Bundle extras = picdata.getExtras();
    if (extras != null) {
    Bitmap photo = extras.getParcelable("data");
    Drawable drawable = new BitmapDrawable(photo);
    // draw转换为String
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG, 60, stream);
    byte[] b = stream.toByteArray(); 

    // 将图片流以字符串形式存储下来
    userimg = new String(Base64Coder.encodeLines(b)); //在这里我们把图片转换成base64并存进userimg里面


    zhuceimg.setImageDrawable(drawable);//图片显示在界面上zhuceimg为imageview控件
    }
    }

    final Handler handlerzhuce = new Handler() {
    public void handleMessage(Message msg) {


    String str = (String) msg.obj;
    if (str != null) {
    Toast.makeText(Userzhuce.this, "完善信息成功!", Toast.LENGTH_SHORT)
    .show();
    } else {
    Toast.makeText(Userzhuce.this, "信息完善失败!!", Toast.LENGTH_SHORT)
    .show();
    }
    }


    };

    //接下来是是数据的发送

    public class OnClickListenerzhuce implements OnClickListener {
    // 提交
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    if (zhucenc.getText().toString().equals("")) {
    Toast.makeText(Userzhuce.this, "昵称不能为空!!!", Toast.LENGTH_SHORT)
    .show();
    } else {
    new Thread(new Runnable() {
    @Override
    public void run() {//封装数据

    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("userphone",
    userphone));
    params.add(new BasicNameValuePair("username", zhucenc
    .getText().toString()));
    params.add(new BasicNameValuePair("address",
    zhuceaddress.getText().toString()));
    params.add(new BasicNameValuePair("photo",userimg));

    FabuhttpClient zhuce = new FabuhttpClient();
    try {
    String str = zhuce.faburubbishifo(params,
    HttpPath.USERUPDATE_PATH);
    Message ms = handlerzhuce.obtainMessage();
    ms.obj = str;
    handlerzhuce.sendMessage(ms);

    } catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    Toast.makeText(Userzhuce.this, "信息完善失败",
    Toast.LENGTH_SHORT).show();
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    Toast.makeText(Userzhuce.this, "完善信息失败!!",
    Toast.LENGTH_SHORT).show();
    e.printStackTrace();
    }
    }
    }).start();
    }
    }
    }

    下面是用到的两个类,一个是Base64Coder一个是FabuhttpClient;

    FabuhttpClient代码如下:

    public class FabuhttpClient {
        
    public String faburubbishifo(List<NameValuePair> rubbishifo,String path) throws ClientProtocolException, IOException
    {
    String str=null;
    HttpClient httpclient=new DefaultHttpClient();
    HttpPost httppost=new HttpPost(path);
    try {
    httppost.setEntity(new UrlEncodedFormEntity(rubbishifo,"UTF-8"));
    HttpResponse httpResponse=httpclient.execute(httppost);

    int code=httpResponse.getStatusLine().getStatusCode();
    if(code==200)
    {
    str="发布成功";
    Log.i("SMSpassActivity", "连接成功");
    }
    } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    Log.d("client",str);
    return str;
    }
    }

    Base64Coder代码如下:

    public class Base64Coder { // The line separator string of the operating system.
    private static final String systemLineSeparator = System
    .getProperty("line.separator");


    // Mapping table from 6-bit nibbles to Base64 characters.
    private static char[] map1 = new char[64];
    static {
    int i = 0;
    for (char c = 'A'; c <= 'Z'; c++)
    map1[i++] = c;
    for (char c = 'a'; c <= 'z'; c++)
    map1[i++] = c;
    for (char c = '0'; c <= '9'; c++)
    map1[i++] = c;
    map1[i++] = '+';
    map1[i++] = '/';
    }


    // Mapping table from Base64 characters to 6-bit nibbles.
    private static byte[] map2 = new byte[128];
    static {
    for (int i = 0; i < map2.length; i++)
    map2[i] = -1;
    for (int i = 0; i < 64; i++)
    map2[map1[i]] = (byte) i;
    }

    public static String encodeString(String s) {
    return new String(encode(s.getBytes()));
    }

    public static String encodeLines(byte[] in) {
    return encodeLines(in, 0, in.length, 76, systemLineSeparator);
    }

    public static String encodeLines(byte[] in, int iOff, int iLen,
    int lineLen, String lineSeparator) {
    int blockLen = (lineLen * 3) / 4;
    if (blockLen <= 0)
    throw new IllegalArgumentException();
    int lines = (iLen + blockLen - 1) / blockLen;
    int bufLen = ((iLen + 2) / 3) * 4 + lines * lineSeparator.length();
    StringBuilder buf = new StringBuilder(bufLen);
    int ip = 0;
    while (ip < iLen) {
    int l = Math.min(iLen - ip, blockLen);
    buf.append(encode(in, iOff + ip, l));
    buf.append(lineSeparator);
    ip += l;
    }
    return buf.toString();
    }

    public static char[] encode(byte[] in) {
    return encode(in, 0, in.length);
    }

    public static char[] encode(byte[] in, int iLen) {
    return encode(in, 0, iLen);
    }
    public static char[] encode(byte[] in, int iOff, int iLen) {
    int oDataLen = (iLen * 4 + 2) / 3; // output length without padding
    int oLen = ((iLen + 2) / 3) * 4; // output length including padding
    char[] out = new char[oLen];
    int ip = iOff;
    int iEnd = iOff + iLen;
    int op = 0;
    while (ip < iEnd) {
    int i0 = in[ip++] & 0xff;
    int i1 = ip < iEnd ? in[ip++] & 0xff : 0;
    int i2 = ip < iEnd ? in[ip++] & 0xff : 0;
    int o0 = i0 >>> 2;
    int o1 = ((i0 & 3) << 4) | (i1 >>> 4);
    int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
    int o3 = i2 & 0x3F;
    out[op++] = map1[o0];
    out[op++] = map1[o1];
    out[op] = op < oDataLen ? map1[o2] : '=';
    op++;
    out[op] = op < oDataLen ? map1[o3] : '=';
    op++;
    }
    return out;
    }
    public static String decodeString(String s) {
    return new String(decode(s));
    }
    public static byte[] decodeLines(String s) {
    char[] buf = new char[s.length() + 3];
    int p = 0;
    for (int ip = 0; ip < s.length(); ip++) {
    char c = s.charAt(ip);
    if (c != ' ' && c != '\r' && c != '\n' && c != '\t')
    buf[p++] = c;
    }
    while ((p % 4) != 0)
    buf[p++] = '0';


    return decode(buf, 0, p);
    }
    public static byte[] decode(String s) {
    return decode(s.toCharArray());
    }
    public static byte[] decode(char[] in) {
    return decode(in, 0, in.length);
    }

    public static byte[] decode(char[] in, int iOff, int iLen) {
    if (iLen % 4 != 0)
    throw new IllegalArgumentException(
    "Length of Base64 encoded input string is not a multiple of 4.");
    while (iLen > 0 && in[iOff + iLen - 1] == '=')
    iLen--;
    int oLen = (iLen * 3) / 4;
    byte[] out = new byte[oLen];
    int ip = iOff;
    int iEnd = iOff + iLen;
    int op = 0;
    while (ip < iEnd) {
    int i0 = in[ip++];
    int i1 = in[ip++];
    int i2 = ip < iEnd ? in[ip++] : 'A';
    int i3 = ip < iEnd ? in[ip++] : 'A';
    if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)
    throw new IllegalArgumentException(
    "Illegal character in Base64 encoded data.");
    int b0 = map2[i0];
    int b1 = map2[i1];
    int b2 = map2[i2];
    int b3 = map2[i3];
    if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)
    throw new IllegalArgumentException(
    "Illegal character in Base64 encoded data.");
    int o0 = (b0 << 2) | (b1 >>> 4);
    int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2);
    int o2 = ((b2 & 3) << 6) | b3;
    out[op++] = (byte) o0;
    if (op < oLen)
    out[op++] = (byte) o1;
    if (op < oLen)
    out[op++] = (byte) o2;
    }
    return out;
    }


    // Dummy constructor.
    private Base64Coder() {
    }

    安卓端结束:下面是服务器端的代码:


    public class UserUpdate extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    doPost(request, response);


    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    boolean flag = false;
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    String userphone = request.getParameter("userphone");
    String username = request.getParameter("username");
    String address = request.getParameter("address");
    //接收图片
    String userimage = request.getParameter("photo");
    System.out.println(userimage);
    //base 转化图片
    BASE64Decoder decoder = new BASE64Decoder();
    byte[] ph = decoder.decodeBuffer(userimage);
    System.out.println(ph);
    for(int i=0;i<ph.length;++i)  
            {  
                if(ph[i]<0)  
                {//调整异常数据   
                ph[i]+=256;  
                }  
            }  
            //生成jpeg图片   
    String imgFilePath =request.getSession().getServletContext()
    .getRealPath("/")
    + "images"+"/"+userphone+".jpg";
    //String imgFilePath ="d://223.jpg";// 新生成的图片
    String userimg="http://192.168.1.110:8080/back/images"+"/"+userphone+".jpg";//用用户手机命名
    System.out.println(userphone + username + address + "11111111111");
    //更新信息
    userservice se = new userserviceImp();

    flag = se.updatauserapp(username,address, userimg,userphone);
    if (flag) {
    // 更新成功
    OutputStream out = new FileOutputStream(imgFilePath);
    out.write(ph);
    out.flush();
    out.close();
    } else {
    // 更新不成功
    String set = "no";
    PrintWriter out = response.getWriter();
    out.print(set);
    out.flush();
    out.close();
    }
    }

    服务器端结束;




    }

    展开全文
  • HTML5图片上传裁剪代码,选择图片上传,对指定区域进行裁剪
  • 1、裁剪插件cropper 2、微信公众号内,微信sdk cropper挺简单的,如下: <VueCropper ref="cropper" :img="imguri || option.img" :outputType="option.outputType" ...

    1、裁剪插件 cropper

    2、微信公众号内,微信sdk

     

    cropper挺简单的,如下:

    <VueCropper ref="cropper" 
                            :img="imguri || option.img" 
                            :outputType="option.outputType"
                            :full="option.full" 
                            :canScale="option.canScale" 
                            :canMove="option.canMove" 
                            :canMoveBox="option.canMoveBox" 
                            :original="option.original" 
                            :autoCrop="option.autoCrop" 
                            :autoCropWidth="option.autoCropWidth" 
                            :autoCropHeight="option.autoCropHeight" 
                            :fixedBox="option.fixedBox"></VueCropper>

     

    配置:

    当然,以上说的直接裁剪图插件的用法,下面才是正式开始:


     

    以上图片可能为你解决了:
    1、sdk选图预览的base64 不同系统的问题
    2、sdk选图上传封装的思路
    3、如何写出复杂的代码,(尴尬,代码太多,希望可以指点一下,嘻嘻)

     

    好了,到这里基本完成,代码我就不贴出来,要多敲敲,方能记得深刻!!!

     

    使用方法更简单:

    备注:

         参数1:选择图片个数
         参数2:imgurl 返回图片路径,index返回第几张的图的下标
         参数3:上传失败时的回调,index上传失败图片的下标

     

    展开全文
  • cropper+layui实现图片裁剪、旋转、放大缩小后上传 适用于头像、图片修改等等
  • 2.将图片传入后台:用户选择图片的时候选择的是各种各样的,但是我们的网页显示图片大小是有限的,所以我们就要在用户选择图片之后将图片添加到后台进行压缩,压缩成我们想要的大小,之后再显示到页面才好 ...
  • 图片裁剪上传插件—jquery.photoClip.js

    万次阅读 2018-01-29 16:29:38
    分别介绍了两种插件 1.cropper.js ... ...接下来只是实现一个简单的功能:网页中可以上传图片,然后对图片进行裁剪,点击确定后会显示出裁剪后的图片。 裁剪图片  .row{  
  • 该资源主要是对上传图片进行裁剪,用于网页和移动端,可调节裁剪清晰度和裁剪大小,技术采用的就是jQuery前端框架,希望对大家有帮助。
  • 本文主要介绍了基于asp.net实现图片在线上传并在线裁剪功能的具体事例代码,具有一定的参考价值。需要的朋友可以参考下
  • photoClip图片裁剪插件

    2019-01-24 15:07:37
    网页中可以上传图片,然后对图片进行裁剪,点击确定后会显示出裁剪后的图片。
  • 感激原创,原本cropper是layui的一个插件。但一个页面只能有一个图片裁剪。 现在稍微改良了下,解决了页面有两个上传图片时,点击第一个后,关闭,再点击第二个时,第一个也会出现,并且无法关闭的问题。
  • 网页裁剪图片,不需要经过服务器。 这个是用 https://github.com/mailru/FileAPI 框架实现的。配合jcrop. 高级浏览器 使用 canvas 裁剪,ie6 7 8使用 flash过度。 核心代码: var el = $('input').get(0); ...
  •  我们在网页上传图片的时候,特别是上传图像等操作,需要限制用户上传图片的类型、大小、有时候还需要对图片进行剪切。这样的需求在我们工作中经常遇到。今天就来说说在web开发中,如何对上传的图片判断文件的类型...
  • 图片上传在上篇博文中讲过。 这里主要是裁剪的实现,需要用到bitmapcutter组件。 jquery.bitmapcutter该插件由Jericho开发,它的主要作用是客户端裁图。 引入jquery库 <script language="javascript" type=...
  • Laravel-nova图片拖拽上传裁剪组 \ Weiwait \ NovaImage \ Image :: make ( '图片' , 'image' ) -> cropper ([ 'autoCrop' => true , 'fixed' => true , 'fixedNumber' => [ 16 , 9 ], 'enlarge' => 3 , ])-> ...
  • jQuery图片裁剪.rar

    2015-07-27 22:54:37
    基于jquery的HTML5前端图片处理工具,可以在网页上实现图片的旋转、缩放、剪切等操作,上传还是需要后台服务处理。
  • "> <div class="layui-upload-list layui-upload-listlogo" data-role="addlogoimg">div> 上传logobutton> ,image/png"/> div> 图片裁剪框 ;width: 500px;height: 400px;"> ;max-height: 400px;"> div> 最初: $...
  • 4.调用chooseImage实现选择本地图片或相机,将返回的图片id通过getLocalImgData转为base64位,成功之后通过父子组件传值传递给裁剪组件(注:ios和安卓转base64之后得到的结果不一样,安卓得到的图片地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,109
精华内容 1,643
关键字:

网页上传图片裁剪