星空网 > 软件开发 > 操作系统

图片压缩的工具类

比如,项目中调用相,返回一张图片一眼看过去,就是放大后才有区别。

1. 项目中用到的的代码

// 从SD卡里直接获取Bitmap  private Bitmap getDiskBitmap(String pathString) {    Bitmap bitmap = null;    try {      File file = new File(pathString);      if (file.exists()) {        bitmap = BitmapFactory.decodeFile(pathString);      }    } catch (Exception e) {      // TODO: handle exception    }    return bitmap;  }

// 转换成64位的Bitmap  public static String bitmapToBase64(Bitmap bitmap) {    String result = null;    ByteArrayOutputStream baos = null;    try {      if (bitmap != null) {        baos = new ByteArrayOutputStream();        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);        baos.flush();        baos.close();        byte[] bitmapBytes = baos.toByteArray();        result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);      }    } catch (IOException e) {      e.printStackTrace();    } finally {      try {        if (baos != null) {          baos.flush();          baos.close();        }      } catch (IOException e) {        e.printStackTrace();      }    }    return result;  }

// 裁剪  public static Bitmap imageCrop(Bitmap bitmap, int num1, int num2,      boolean isRecycled) {    if (bitmap == null) {      return null;    }    int w = bitmap.getWidth(); // 得到图片的宽,高    int h = bitmap.getHeight();    int retX, retY;    int nw, nh;    if (w > h) {      if (h > w * num2 / num1) {        nw = w;        nh = w * num2 / num1;        retX = 0;        retY = (h - nh) / 2;      } else {        nw = h * num1 / num2;        nh = h;        retX = (w - nw) / 2;        retY = 0;      }    } else {      if (w > h * num2 / num1) {        nh = h;        nw = h * num2 / num1;        retY = 0;        retX = (w - nw) / 2;      } else {        nh = w * num1 / num2;        nw = w;        retY = (h - nh) / 2;        retX = 0;      }    }    Bitmap bmp = Bitmap.createBitmap(bitmap, retX, retY, nw, nh, null,        false);    if (isRecycled && bitmap != null && !bitmap.equals(bmp)        && !bitmap.isRecycled()) {      bitmap.recycle();// 回收原图片      bitmap = null;    }    return bmp;  }

private void encode() {    File file = new File(Environment.getExternalStorageDirectory(),"famous_bitmap_painting.jpg");    try {      if (file.exists()) {        file.delete();      }      file.createNewFile();    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }    String imgPath = getIntent().getStringExtra("famousPicturePath");    //图片的地址imgBitmapPath    String imgBitmapPath = file.getPath().toString();    try {      ImageUtils.createImageThumbnail(getApplicationContext(), imgPath,          imgBitmapPath, 500, 100);    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }    //bitmap ---createImageThumbnail工具类裁剪后处理后的图片
    Bitmap bitmap = getDiskBitmap(imgBitmapPath);          if (bitmap != null) {
      //bitmap ---imageCrop类裁剪后处理后的图片    
      Bitmap bitmap2 = imageCrop(bitmap, 500, 500, false);      search_img.setImageBitmap(bitmap2);
//bitmap 转成---64位字节 
      String base64 = bitmapToBase64(bitmap);         }  }

2. 重点是这个工具类,其中大部分无用的,有用的可以直接

public class ImageUtils {  public final static String SDCARD_MNT = "/mnt/sdcard";  public final static String SDCARD = "/sdcard";  /** 请求相册 */  public static final int REQUEST_CODE_GETIMAGE_BYSDCARD = 0;  /** 请求相机 */  public static final int REQUEST_CODE_GETIMAGE_BYCAMERA = 1;  /** 请求裁剪 */  public static final int REQUEST_CODE_GETIMAGE_BYCROP = 2;  public static final int REQUEST_CODE_GETIMAGE_IMAGEPAVER = 3;  /**   * 写图片文件 在Android系统中,文件保存在 /data/data/PACKAGE_NAME/files 目录下   *   * @throws IOException   */  public static void saveImage(Context context, String fileName, Bitmap bitmap)      throws IOException {    saveImage(context, fileName, bitmap, 100);  }  public static void saveImage(Context context, String fileName,      Bitmap bitmap, int quality) throws IOException {    if (bitmap == null || fileName == null || context == null)      return;    FileOutputStream fos = context.openFileOutput(fileName,        Context.MODE_PRIVATE);    ByteArrayOutputStream stream = new ByteArrayOutputStream();    bitmap.compress(CompressFormat.JPEG, quality, stream);    byte[] bytes = stream.toByteArray();    fos.write(bytes);    fos.close();  }  /**   * 写图片文件到SD卡   *   * @throws IOException   */  public static void saveImageToSD(Context ctx, String filePath,      Bitmap bitmap, int quality) throws IOException {    if (bitmap != null) {      File file = new File(filePath.substring(0,          filePath.lastIndexOf(File.separator)));      if (!file.exists()) {        file.mkdirs();      }      BufferedOutputStream bos = new BufferedOutputStream(          new FileOutputStream(filePath));      bitmap.compress(CompressFormat.JPEG, quality, bos);      bos.flush();      bos.close();      if (ctx != null) {        scanPhoto(ctx, filePath);      }    }  }  public static void saveBackgroundImage(Context ctx, String filePath,      Bitmap bitmap, int quality) throws IOException {    if (bitmap != null) {      File file = new File(filePath.substring(0,          filePath.lastIndexOf(File.separator)));      if (!file.exists()) {        file.mkdirs();      }      BufferedOutputStream bos = new BufferedOutputStream(          new FileOutputStream(filePath));      bitmap.compress(CompressFormat.PNG, quality, bos);      bos.flush();      bos.close();      if (ctx != null) {        scanPhoto(ctx, filePath);      }    }  }  /**   * 让Gallery上能马上看到该图片   */  private static void scanPhoto(Context ctx, String imgFileName) {    Intent mediaScanIntent = new Intent(        Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);    File file = new File(imgFileName);    Uri contentUri = Uri.fromFile(file);    mediaScanIntent.setData(contentUri);    ctx.sendBroadcast(mediaScanIntent);  }  /**   * 获取bitmap   *   * @param context   * @param fileName   * @return   */  public static Bitmap getBitmap(Context context, String fileName) {    FileInputStream fis = null;    Bitmap bitmap = null;    try {      fis = context.openFileInput(fileName);      bitmap = BitmapFactory.decodeStream(fis);    } catch (FileNotFoundException e) {      e.printStackTrace();    } catch (OutOfMemoryError e) {      e.printStackTrace();    } finally {      try {        fis.close();      } catch (Exception e) {      }    }    return bitmap;  }  /**   * 获取bitmap   *   * @param filePath   * @return   */  public static Bitmap getBitmapByPath(String filePath) {    return getBitmapByPath(filePath, null);  }  public static Bitmap getBitmapByPath(String filePath,      BitmapFactory.Options opts) {    FileInputStream fis = null;    Bitmap bitmap = null;    try {      File file = new File(filePath);      fis = new FileInputStream(file);      bitmap = BitmapFactory.decodeStream(fis, null, opts);    } catch (FileNotFoundException e) {      e.printStackTrace();    } catch (OutOfMemoryError e) {      e.printStackTrace();    } finally {      try {        fis.close();      } catch (Exception e) {      }    }    return bitmap;  }  /**   * 获取bitmap   *   * @param file   * @return   */  public static Bitmap getBitmapByFile(File file) {    FileInputStream fis = null;    Bitmap bitmap = null;    try {      fis = new FileInputStream(file);      bitmap = BitmapFactory.decodeStream(fis);    } catch (FileNotFoundException e) {      e.printStackTrace();    } catch (OutOfMemoryError e) {      e.printStackTrace();    } finally {      try {        fis.close();      } catch (Exception e) {      }    }    return bitmap;  }  /**   * 使用当前时间戳拼接一个唯一的文件名   *   * @param format   * @return   */  public static String getTempFileName() {    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss_SS");    String fileName = format.format(new Timestamp(System        .currentTimeMillis()));    return fileName;  }  /**   * 获取照相机使用的目录   *   * @return   */  public static String getCamerPath() {    return Environment.getExternalStorageDirectory() + File.separator        + "FounderNews" + File.separator;  }  /**   * 判断当前Url是否标准的content://样式,如果不是,则返回绝对路径   *   * @param uri   * @return   */  public static String getAbsolutePathFromNoStandardUri(Uri mUri) {    String filePath = null;    String mUriString = mUri.toString();    mUriString = Uri.decode(mUriString);    String pre1 = "file://" + SDCARD + File.separator;    String pre2 = "file://" + SDCARD_MNT + File.separator;    if (mUriString.startsWith(pre1)) {      filePath = Environment.getExternalStorageDirectory().getPath()          + File.separator + mUriString.substring(pre1.length());    } else if (mUriString.startsWith(pre2)) {      filePath = Environment.getExternalStorageDirectory().getPath()          + File.separator + mUriString.substring(pre2.length());    }    return filePath;  }  /**   * 通过uri获取文件的绝对路径   *   * @param uri   * @return   */  @SuppressWarnings("deprecation")  public static String getAbsoluteImagePath(Activity context, Uri uri) {    String imagePath = "";    String[] proj = { MediaStore.Images.Media.DATA };    Cursor cursor = context.managedQuery(uri, proj, // Which columns to                            // return        null, // WHERE clause; which rows to return (all rows)        null, // WHERE clause selection arguments (none)        null); // Order-by clause (ascending by name)    if (cursor != null) {      int column_index = cursor          .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);      if (cursor.getCount() > 0 && cursor.moveToFirst()) {        imagePath = cursor.getString(column_index);      }    }    return imagePath;  }  /**   * 获取图片缩略图 只有Android2.1以上版本支持   *   * @param imgName   * @param kind   *      MediaStore.Images.Thumbnails.MICRO_KIND   * @return   */  @SuppressWarnings("deprecation")  public static Bitmap loadImgThumbnail(Activity context, String imgName,      int kind) {    Bitmap bitmap = null;    String[] proj = { MediaStore.Images.Media._ID,        MediaStore.Images.Media.DISPLAY_NAME };    Cursor cursor = context.managedQuery(        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj,        MediaStore.Images.Media.DISPLAY_NAME + "='" + imgName + "'",        null, null);    if (cursor != null && cursor.getCount() > 0 && cursor.moveToFirst()) {      ContentResolver crThumb = context.getContentResolver();      BitmapFactory.Options options = new BitmapFactory.Options();      options.inSampleSize = 1;      // bitmap = MethodsCompat.getThumbnail(crThumb, cursor.getInt(0),      // kind, options);    }    return bitmap;  }  public static Bitmap loadImgThumbnail(String filePath, int w, int h) {    Bitmap bitmap = getBitmapByPath(filePath);    return zoomBitmap(bitmap, w, h);  }  /**   * 获取SD卡中最新图片路径   *   * @return   */  public static String getLatestImage(Activity context) {    String latestImage = null;    String[] items = { MediaStore.Images.Media._ID,        MediaStore.Images.Media.DATA };    Cursor cursor = context.managedQuery(        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, items, null,        null, MediaStore.Images.Media._ID + " desc");    if (cursor != null && cursor.getCount() > 0) {      cursor.moveToFirst();      for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor          .moveToNext()) {        latestImage = cursor.getString(1);        break;      }    }    return latestImage;  }  /**   * 计算缩放图片的宽高   *   * @param img_size   * @param square_size   * @return   */  public static int[] scaleImageSize(int[] img_size, int square_size) {    if (img_size[0] <= square_size && img_size[1] <= square_size)      return img_size;    double ratio = square_size        / (double) Math.max(img_size[0], img_size[1]);    return new int[] { (int) (img_size[0] * ratio),        (int) (img_size[1] * ratio) };  }  /**   * 创建缩略图   *   * @param context   * @param largeImagePath   *      原始大图路径   * @param thumbfilePath   *      输出缩略图路径   * @param square_size   *      输出图片宽度   * @param quality   *      输出图片质量   * @throws IOException   */  public static void createImageThumbnail(Context context,      String largeImagePath, String thumbfilePath, int square_size,      int quality) throws IOException {    BitmapFactory.Options opts = new BitmapFactory.Options();    opts.inSampleSize = 1;    // 原始图片bitmap    Bitmap cur_bitmap = getBitmapByPath(largeImagePath, opts);    if (cur_bitmap == null)      return;    // 原始图片的高宽    int[] cur_img_size = new int[] { cur_bitmap.getWidth(),        cur_bitmap.getHeight() };    // 计算原始图片缩放后的宽高    int[] new_img_size = scaleImageSize(cur_img_size, square_size);    // 生成缩放后的bitmap    Bitmap thb_bitmap = zoomBitmap(cur_bitmap, new_img_size[0],        new_img_size[1]);    // 生成缩放后的图片文件    saveImageToSD(null, thumbfilePath, thb_bitmap, quality);  }  /**   * 放大缩小图片   *   * @param bitmap   * @param w   * @param h   * @return   */  public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {    Bitmap newbmp = null;    if (bitmap != null) {      int width = bitmap.getWidth();      int height = bitmap.getHeight();      Matrix matrix = new Matrix();      float scaleWidht = ((float) w / width);      float scaleHeight = ((float) h / height);      matrix.postScale(scaleWidht, scaleHeight);      newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix,          true);    }    return newbmp;  }  public static Bitmap scaleBitmap(Bitmap bitmap) {    // 获取这个图片的宽和高    int width = bitmap.getWidth();    int height = bitmap.getHeight();    // 定义预转换成的图片的宽度和高度    int newWidth = 200;    int newHeight = 200;    // 计算缩放率,新尺寸除原始尺寸    float scaleWidth = ((float) newWidth) / width;    float scaleHeight = ((float) newHeight) / height;    // 创建操作图片用的matrix对象    Matrix matrix = new Matrix();    // 缩放图片动作    matrix.postScale(scaleWidth, scaleHeight);    // 旋转图片 动作    // matrix.postRotate(45);    // 创建新的图片    Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height,        matrix, true);    return resizedBitmap;  }  /**   * (缩放)重绘图片   *   * @param context   *      Activity   * @param bitmap   * @return   */  public static Bitmap reDrawBitMap(Activity context, Bitmap bitmap) {    DisplayMetrics dm = new DisplayMetrics();    context.getWindowManager().getDefaultDisplay().getMetrics(dm);    int rHeight = dm.heightPixels;    int rWidth = dm.widthPixels;    // float rHeight=dm.heightPixels/dm.density+0.5f;    // float rWidth=dm.widthPixels/dm.density+0.5f;    // int height=bitmap.getScaledHeight(dm);    // int width = bitmap.getScaledWidth(dm);    int height = bitmap.getHeight();    int width = bitmap.getWidth();    float zoomScale;    /** 方式3 **/    if (width >= rWidth)      zoomScale = ((float) rWidth) / width;    else      zoomScale = 1.0f;    // 创建操作图片用的matrix对象    Matrix matrix = new Matrix();    // 缩放图片动作    matrix.postScale(zoomScale, zoomScale);    Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,        bitmap.getWidth(), bitmap.getHeight(), matrix, true);    return resizedBitmap;  }  /**   * 将Drawable转化为Bitmap   *   * @param drawable   * @return   */  public static Bitmap drawableToBitmap(Drawable drawable) {    int width = drawable.getIntrinsicWidth();    int height = drawable.getIntrinsicHeight();    Bitmap bitmap = Bitmap.createBitmap(width, height, drawable        .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888        : Bitmap.Config.RGB_565);    Canvas canvas = new Canvas(bitmap);    drawable.setBounds(0, 0, width, height);    drawable.draw(canvas);    return bitmap;  }  /**   * 获得圆角图片的方法   *   * @param bitmap   * @param roundPx   *      一般设成14   * @return   */  public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),        bitmap.getHeight(), Config.ARGB_8888);    Canvas canvas = new Canvas(output);    final int color = 0xff424242;    final Paint paint = new Paint();    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());    final RectF rectF = new RectF(rect);    paint.setAntiAlias(true);    canvas.drawARGB(0, 0, 0, 0);    paint.setColor(color);    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));    canvas.drawBitmap(bitmap, rect, rect, paint);    return output;  }  /**   * 获得带倒影的图片方法   *   * @param bitmap   * @return   */  public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {    final int reflectionGap = 4;    int width = bitmap.getWidth();    int height = bitmap.getHeight();    Matrix matrix = new Matrix();    matrix.preScale(1, -1);    Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2,        width, height / 2, matrix, false);    Bitmap bitmapWithReflection = Bitmap.createBitmap(width,        (height + height / 2), Config.ARGB_8888);    Canvas canvas = new Canvas(bitmapWithReflection);    canvas.drawBitmap(bitmap, 0, 0, null);    Paint deafalutPaint = new Paint();    canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);    canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);    Paint paint = new Paint();    LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,        bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,        0x00ffffff, TileMode.CLAMP);    paint.setShader(shader);    // Set the Transfer mode to be porter duff and destination in    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));    // Draw a rectangle using the paint with our linear gradient    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()        + reflectionGap, paint);    return bitmapWithReflection;  }  /**   * 将bitmap转化为drawable   *   * @param bitmap   * @return   */  public static Drawable bitmapToDrawable(Bitmap bitmap) {    Drawable drawable = new BitmapDrawable(bitmap);    return drawable;  }  /**   * 获取图片类型   *   * @param file   * @return   */  public static String getImageType(File file) {    if (file == null || !file.exists()) {      return null;    }    InputStream in = null;    try {      in = new FileInputStream(file);      String type = getImageType(in);      return type;    } catch (IOException e) {      return null;    } finally {      try {        if (in != null) {          in.close();        }      } catch (IOException e) {      }    }  }  /**   * 获取图片的类型信息   *   * @param in   * @return   * @see #getImageType(byte[])   */  public static String getImageType(InputStream in) {    if (in == null) {      return null;    }    try {      byte[] bytes = new byte[8];      in.read(bytes);      return getImageType(bytes);    } catch (IOException e) {      return null;    }  }  /**   * 获取图片的类型信息   *   * @param bytes   *      2~8 byte at beginning of the image file   * @return image mimetype or null if the file is not image   */  public static String getImageType(byte[] bytes) {    if (isJPEG(bytes)) {      return "image/jpeg";    }    if (isGIF(bytes)) {      return "image/gif";    }    if (isPNG(bytes)) {      return "image/png";    }    if (isBMP(bytes)) {      return "application/x-bmp";    }    return null;  }  private static boolean isJPEG(byte[] b) {    if (b.length < 2) {      return false;    }    return (b[0] == (byte) 0xFF) && (b[1] == (byte) 0xD8);  }  private static boolean isGIF(byte[] b) {    if (b.length < 6) {      return false;    }    return b[0] == 'G' && b[1] == 'I' && b[2] == 'F' && b[3] == '8'        && (b[4] == '7' || b[4] == '9') && b[5] == 'a';  }  private static boolean isPNG(byte[] b) {    if (b.length < 8) {      return false;    }    return (b[0] == (byte) 137 && b[1] == (byte) 80 && b[2] == (byte) 78        && b[3] == (byte) 71 && b[4] == (byte) 13 && b[5] == (byte) 10        && b[6] == (byte) 26 && b[7] == (byte) 10);  }  private static boolean isBMP(byte[] b) {    if (b.length < 2) {      return false;    }    return (b[0] == 0x42) && (b[1] == 0x4d);  }  /**  *   */  public static String getImagePath(Uri uri, Activity context) {    String[] projection = { MediaColumns.DATA };    Cursor cursor = context.getContentResolver().query(uri, projection,        null, null, null);    if (cursor != null) {      cursor.moveToFirst();      int columIndex = cursor.getColumnIndexOrThrow(MediaColumns.DATA);      String ImagePath = cursor.getString(columIndex);      cursor.close();      return ImagePath;    }    return uri.toString();  }  static Bitmap bitmap = null;  /**   * 2014年8月13日   *   * @param uri   * @param context   *      E-mail:mr.huangwenwei@gmail.com   */  public static Bitmap loadPicasaImageFromGalley(final Uri uri,      final Activity context) {    String[] projection = { MediaColumns.DATA, MediaColumns.DISPLAY_NAME };    Cursor cursor = context.getContentResolver().query(uri, projection,        null, null, null);    if (cursor != null) {      cursor.moveToFirst();      int columIndex = cursor.getColumnIndex(MediaColumns.DISPLAY_NAME);      if (columIndex != -1) {        new Thread(new Runnable() {          @Override          public void run() {            try {              bitmap = android.provider.MediaStore.Images.Media                  .getBitmap(context.getContentResolver(),                      uri);            } catch (FileNotFoundException e) {              e.printStackTrace();            } catch (IOException e) {              e.printStackTrace();            }          }        }).start();      }      cursor.close();      return bitmap;    } else      return null;  }    public static Bitmap rotateAndScale(Bitmap b, int degrees, float maxSideLen) {    return rotateAndScale(b, degrees, maxSideLen, true);  }  public static Bitmap rotateAndScale(Bitmap b, int degrees, float maxSideLen, boolean recycle) {//    if (null == b || degrees == 0 && b.getWidth() <= maxSideLen + 10 && b.getHeight() <= maxSideLen + 10) {//      return b;//    }    Matrix m = new Matrix();    if (degrees != 0) {      m.setRotate(degrees);    }//    float scale = Math.min(maxSideLen / b.getWidth(), maxSideLen / b.getHeight());//    if (scale < 1) {//      m.postScale(scale, scale);//    }    try {      Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, true);      if (null != b2 && b != b2) {        if (recycle) {          b.recycle();        }        b = b2;      }    } catch (OutOfMemoryError e) {    }    return b;  }  public static Bitmap decodeByteArrayUnthrow(byte[] data, BitmapFactory.Options opts) {    try {      return BitmapFactory.decodeByteArray(data, 0, data.length, opts);    } catch (Throwable e) {          }    return null;  }  public static boolean saveBitmap2file(Bitmap bmp, File file, Bitmap.CompressFormat format, int quality) {    if (file.isFile())      file.delete();    OutputStream stream = null;    try {      stream = new FileOutputStream(file);    } catch (FileNotFoundException e) {      return false;    }    return bmp.compress(format, quality, stream);  }      /*   * 视频录制所需工具类   */  public static List<Camera.Size> getResolutionList(Camera camera)  {     Parameters parameters = camera.getParameters();    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();    return previewSizes;  }    public static class ResolutionComparator implements Comparator<Camera.Size>{    @Override    public int compare(Size lhs, Size rhs) {      if(lhs.height!=rhs.height)      return lhs.height-rhs.height;      else      return lhs.width-rhs.width;    }  }}




原标题:图片压缩的工具类

关键词:图片

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

做东南亚跨境电商怎么样,要考虑哪些因素?:https://www.goluckyvip.com/news/7681.html
全美最大仓库区都要“塞不下”了;eBay二季度财报超预期,同比转盈为亏 :https://www.goluckyvip.com/news/7682.html
TikTok海外营销推广老是被限流?你可能忽略了这些因素! :https://www.goluckyvip.com/news/7683.html
Shopee打造爆款的四大基础:https://www.goluckyvip.com/news/7684.html
shopee如何快速出单,打造店铺爆款产品?:https://www.goluckyvip.com/news/7685.html
LAZADA订单发货管理流程是怎样的?:https://www.goluckyvip.com/news/7686.html
长治婚庆女司仪和主持人:https://www.vstour.cn/a/366176.html
北京丰台区水上乐园哪家好玩?:https://www.vstour.cn/a/366177.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流