Преглед на файлове

1.修改Android Apex Drivers图片缩放和缓存。

Pen Li преди 7 години
родител
ревизия
1f3e25b343
променени са 46 файла, в които са добавени 291 реда и са изтрити 9 реда
  1. 203 0
      ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/utils/BitmapZoomOutHelper.java
  2. 66 2
      ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/utils/ImageUtil.java
  3. 1 1
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/detail/model/DetailPhotoModel.java
  4. 1 1
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/detail/model/DetailSignatureModel.java
  5. 16 4
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/home/HomeOrderModel.java
  6. 4 1
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/update/PhotoPreviewActivity.java
  7. BIN
      ApexDrivers/app/src/main/res/drawable-hdpi/status_cancel.png
  8. BIN
      ApexDrivers/app/src/main/res/drawable-hdpi/status_delivered.png
  9. BIN
      ApexDrivers/app/src/main/res/drawable-hdpi/status_new.png
  10. BIN
      ApexDrivers/app/src/main/res/drawable-hdpi/status_on_the_way.png
  11. BIN
      ApexDrivers/app/src/main/res/drawable-hdpi/status_reject.png
  12. BIN
      ApexDrivers/app/src/main/res/drawable-hdpi/status_returning.png
  13. BIN
      ApexDrivers/app/src/main/res/drawable-hdpi/status_wait_confirm.png
  14. BIN
      ApexDrivers/app/src/main/res/drawable-hdpi/status_wait_pick_up.png
  15. BIN
      ApexDrivers/app/src/main/res/drawable-ldpi/status_cancel.png
  16. BIN
      ApexDrivers/app/src/main/res/drawable-ldpi/status_delivered.png
  17. BIN
      ApexDrivers/app/src/main/res/drawable-ldpi/status_new.png
  18. BIN
      ApexDrivers/app/src/main/res/drawable-ldpi/status_on_the_way.png
  19. BIN
      ApexDrivers/app/src/main/res/drawable-ldpi/status_reject.png
  20. BIN
      ApexDrivers/app/src/main/res/drawable-ldpi/status_returning.png
  21. BIN
      ApexDrivers/app/src/main/res/drawable-ldpi/status_wait_confirm.png
  22. BIN
      ApexDrivers/app/src/main/res/drawable-ldpi/status_wait_pick_up.png
  23. BIN
      ApexDrivers/app/src/main/res/drawable-mdpi/status_cancel.png
  24. BIN
      ApexDrivers/app/src/main/res/drawable-mdpi/status_delivered.png
  25. BIN
      ApexDrivers/app/src/main/res/drawable-mdpi/status_new.png
  26. BIN
      ApexDrivers/app/src/main/res/drawable-mdpi/status_on_the_way.png
  27. BIN
      ApexDrivers/app/src/main/res/drawable-mdpi/status_reject.png
  28. BIN
      ApexDrivers/app/src/main/res/drawable-mdpi/status_returning.png
  29. BIN
      ApexDrivers/app/src/main/res/drawable-mdpi/status_wait_confirm.png
  30. BIN
      ApexDrivers/app/src/main/res/drawable-mdpi/status_wait_pick_up.png
  31. BIN
      ApexDrivers/app/src/main/res/drawable-xhdpi/status_cancel.png
  32. BIN
      ApexDrivers/app/src/main/res/drawable-xhdpi/status_delivered.png
  33. BIN
      ApexDrivers/app/src/main/res/drawable-xhdpi/status_new.png
  34. BIN
      ApexDrivers/app/src/main/res/drawable-xhdpi/status_on_the_way.png
  35. BIN
      ApexDrivers/app/src/main/res/drawable-xhdpi/status_reject.png
  36. BIN
      ApexDrivers/app/src/main/res/drawable-xhdpi/status_returning.png
  37. BIN
      ApexDrivers/app/src/main/res/drawable-xhdpi/status_wait_confirm.png
  38. BIN
      ApexDrivers/app/src/main/res/drawable-xhdpi/status_wait_pick_up.png
  39. BIN
      ApexDrivers/app/src/main/res/drawable-xxhdpi/status_cancel.png
  40. BIN
      ApexDrivers/app/src/main/res/drawable-xxhdpi/status_delivered.png
  41. BIN
      ApexDrivers/app/src/main/res/drawable-xxhdpi/status_new.png
  42. BIN
      ApexDrivers/app/src/main/res/drawable-xxhdpi/status_on_the_way.png
  43. BIN
      ApexDrivers/app/src/main/res/drawable-xxhdpi/status_reject.png
  44. BIN
      ApexDrivers/app/src/main/res/drawable-xxhdpi/status_returning.png
  45. BIN
      ApexDrivers/app/src/main/res/drawable-xxhdpi/status_wait_confirm.png
  46. BIN
      ApexDrivers/app/src/main/res/drawable-xxhdpi/status_wait_pick_up.png

+ 203 - 0
ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/utils/BitmapZoomOutHelper.java

@@ -0,0 +1,203 @@
+package com.usai.redant.rautils.utils;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+
+public class BitmapZoomOutHelper {
+    protected int[] colorArray;
+    private int srcWidth;
+    private int srcHeight;
+
+    private int destWidth;
+    private int destHeight;
+
+    float[] reds;
+    float[] greens;
+    float[] blues;
+    float[] alphas;
+
+    /**
+     * @brief Bitmap 缩小
+     * */
+    public BitmapZoomOutHelper(Bitmap src) {
+        srcWidth = src.getWidth();
+        srcHeight = src.getHeight();
+
+        colorArray = new int[srcWidth * srcHeight];
+        src.getPixels(colorArray, 0, srcWidth, 0, 0, srcWidth, srcHeight);
+        int a, r, g, b;
+        for (int y = 0; y < srcHeight; y++) {
+            for (int x = 0; x < srcWidth; x++) {
+                int index = y * srcWidth + x;
+                a = (colorArray[index] >> 24) & 0xff;
+                r = (colorArray[index] >> 16) & 0xff;
+                g = (colorArray[index] >> 8) & 0xff;
+                b = colorArray[index] & 0xff;
+                colorArray[index] = (a << 24) | (r << 16) | (g << 8) | b;
+            }
+        }
+    }
+
+    public Bitmap zoomOutBitmap(int width, int height) {
+        // 非缩小情况下,返回原有大小图片
+        if (width >= srcWidth || height >= srcHeight) {
+            width = srcWidth;
+            height = srcHeight;
+        }
+
+        destWidth = width;
+        destHeight = height;
+        reds = new float[srcWidth];
+        greens = new float[srcWidth];
+        blues = new float[srcWidth];
+        alphas = new float[srcWidth];
+
+        Bitmap bitmap = Bitmap.createBitmap(destWidth, destHeight, Config.ARGB_8888);
+        accumPixels(0, 0, srcWidth, srcHeight, bitmap);
+
+        return bitmap;
+    }
+
+    private void accumPixels(int x, int y, int w, int h, Bitmap bitmap) {
+        int sy = y;
+        int syrem = destHeight;
+        int dy, dyrem;
+        dy = 0;
+        dyrem = 0;
+        while (sy < y + h) {
+            int amty;
+            if (dyrem == 0) {
+                for (int i = 0; i < destWidth; i++) {
+                    alphas[i] = reds[i] = greens[i] = blues[i] = 0f;
+                }
+                dyrem = srcHeight;
+            }
+            if (syrem < dyrem) {
+                amty = syrem;
+            } else {
+                amty = dyrem;
+            }
+            int sx = 0;
+            int dx = 0;
+            int sxrem = 0;
+            int dxrem = srcWidth;
+            float a = 0f, r = 0f, g = 0f, b = 0f;
+            while (sx < w) {
+                if (sxrem == 0) {
+                    sxrem = destWidth;
+
+                    a = getAComponent(sx, sy);
+                    r = getRComponent(sx, sy);
+                    g = getGComponent(sx, sy);
+                    b = getBComponent(sx, sy);
+
+                    if (a != 255.0f) {
+                        float ascale = a / 255.0f;
+                        r *= ascale;
+                        g *= ascale;
+                        b *= ascale;
+                    }
+                }
+                int amtx;
+                if (sxrem < dxrem) {
+                    amtx = sxrem;
+                } else {
+                    amtx = dxrem;
+                }
+                float mult = ((float) amtx) * amty;
+                alphas[dx] += mult * a;
+                reds[dx] += mult * r;
+                greens[dx] += mult * g;
+                blues[dx] += mult * b;
+                if ((sxrem -= amtx) == 0) {
+                    sx++;
+                }
+                if ((dxrem -= amtx) == 0) {
+                    dx++;
+                    dxrem = srcWidth;
+                }
+            }
+            if ((dyrem -= amty) == 0) {
+                do {
+                    calcRow(dy, bitmap);
+                    dy++;
+                } while ((syrem -= amty) >= amty && amty == srcHeight);
+            } else {
+                syrem -= amty;
+            }
+            if (syrem == 0) {
+                syrem = destHeight;
+                sy++;
+            }
+        }
+    }
+
+    private void calcRow(int dy, Bitmap bitmap) {
+
+        // Log.e("", "calcRow" + dy);
+
+        float origmult = ((float) srcWidth) * srcHeight;
+        for (int x = 0; x < srcWidth; x++) {
+            float mult = origmult;
+            int a = Math.round(alphas[x] / mult);
+            if (a <= 0) {
+                a = 0;
+            } else if (a >= 255) {
+                a = 255;
+            } else {
+                mult = alphas[x] / 255;
+            }
+            int r = Math.round(reds[x] / mult);
+            int g = Math.round(greens[x] / mult);
+            int b = Math.round(blues[x] / mult);
+
+            if (r < 0) {
+                r = 0;
+            } else if (r > 255) {
+                r = 255;
+            }
+            if (g < 0) {
+                g = 0;
+            } else if (g > 255) {
+                g = 255;
+            }
+            if (b < 0) {
+                b = 0;
+            } else if (b > 255) {
+                b = 255;
+            }
+            setPixelColor(bitmap, x, dy, r, g, b, a);
+        }
+    }
+
+    private void setPixelColor(Bitmap bitmap, int x, int y, int c0, int c1, int c2, int a) {
+        int rgbcolor = (a << 24) + (c0 << 16) + (c1 << 8) + c2;
+        colorArray[((y * srcWidth + x))] = rgbcolor;
+        if (x >= destWidth || y >= destHeight) {
+
+        } else {
+            bitmap.setPixel(x, y, colorArray[((y * srcWidth + x))]);
+        }
+
+    }
+
+    // 获得像素点的透明度 A
+    private int getAComponent(int x, int y) {
+        return (colorArray[((y * srcWidth + x))] & 0xFF000000) >>> 24;
+    }
+
+    // 获得像素点的红色值 R
+    private int getRComponent(int x, int y) {
+        return (colorArray[((y * srcWidth + x))] & 0x00FF0000) >>> 16;
+    }
+
+    // 获得像素点的绿色值 G
+    private int getGComponent(int x, int y) {
+        return (colorArray[((y * srcWidth + x))] & 0x0000FF00) >>> 8;
+    }
+
+    // 获得像素点的蓝色值 B
+    private int getBComponent(int x, int y) {
+        return (colorArray[((y * srcWidth + x))] & 0x000000FF);
+    }
+}

+ 66 - 2
ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/utils/ImageUtil.java

@@ -177,7 +177,7 @@ public class ImageUtil {
         return imgDir + File.separator + md5;
     }
 
-    public static Bitmap loadImageFromURL(Context context, URI uri) {
+    public static Bitmap loadImageFromURL(Context context, URI uri, int width, int height) {
         if (uri == null) {
             return null;
         }
@@ -227,6 +227,28 @@ public class ImageUtil {
                 byte[] bytes = Network.getByteFromURL(uri.toString());
                 bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
 
+                /// 缩小图片
+                if (width > 0 && height > 0) {
+
+                    BitmapZoomOutHelper bitmapZoomOutHelper = new BitmapZoomOutHelper(bitmap);
+                    bitmap = bitmapZoomOutHelper.zoomOutBitmap(width, height);
+
+                    // Bitmap 转 byte,用以保存缩放后的图片
+                    ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+                    Bitmap.CompressFormat format = Bitmap.CompressFormat.PNG;
+
+                    RAImageType type = imageType(bytes);
+                    if (type == RAImageType.RA_IMAGE_TYPE_PNG) {
+                        format = Bitmap.CompressFormat.PNG;
+                    } else if (type == RAImageType.RA_IMAGE_TYPE_JPG) {
+                        format = Bitmap.CompressFormat.JPEG;
+                    }
+
+                    bitmap.compress(format, 100, out);
+                    bytes = out.toByteArray();
+                }
+
                 if (bytes != null && bytes.length > 0) {
                     FileManager.saveBytes2Path(bytes,imgFile.toString());
                 }
@@ -337,7 +359,8 @@ public class ImageUtil {
         try {
 
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(photoFile));
-            bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); // 使用JPG保存,若背景透明的PNG原图,读取出来后背景是黑色的
+            Bitmap.CompressFormat format = Bitmap.CompressFormat.PNG;
+            bitmap.compress(format, 100, bos); // 使用JPG保存,若背景透明的PNG原图,读取出来后背景是黑色的
             bos.flush();
             bos.close();
 
@@ -380,4 +403,45 @@ public class ImageUtil {
         DrawableCompat.setTintList(drawable, null);
     }
 
+    public enum RAImageType {
+        RA_IMAGE_TYPE_PNG,
+        RA_IMAGE_TYPE_JPG,
+        RA_IMAGE_TYPE_BMP,
+        RA_IMAGE_TYPE_GIF,
+        RA_IMAGE_TYPE_UNKNOWN
+    }
+
+    public static RAImageType imageType(byte[] imgBytes) {
+
+        if (imgBytes != null) {
+
+            if (imgBytes.length > 4) {
+
+                // jpeg/jpg
+                // ff d8
+                if (imgBytes[0] == 0xff && imgBytes[1] == 0xd8 && imgBytes[2] == 0xff) {
+                    return RAImageType.RA_IMAGE_TYPE_JPG;
+                }
+                // png
+                // 89 50 4e 47
+                if (imgBytes[0] == 0x89 && imgBytes[1] == 0x50 && imgBytes[2] == 0x4e && imgBytes[3] == 0x47) {
+                    return RAImageType.RA_IMAGE_TYPE_PNG;
+                }
+                // bmp
+                // 42 4D
+                if (imgBytes[0] == 0x42 && imgBytes[1] == 0x4d) {
+                    return RAImageType.RA_IMAGE_TYPE_BMP;
+                }
+
+                // gif
+                // GIF比对[47][49][46]与第五个字符39(37)
+                if (imgBytes[0] == 0x47 && imgBytes[1] == 0x49 && imgBytes[2] == 0x46 && (imgBytes[4] == 0x39 || imgBytes[4] == 0x37)) {
+                    return RAImageType.RA_IMAGE_TYPE_GIF;
+                }
+            }
+
+        }
+        return RAImageType.RA_IMAGE_TYPE_UNKNOWN;
+    }
+
 }

+ 1 - 1
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/detail/model/DetailPhotoModel.java

@@ -62,7 +62,7 @@ public class DetailPhotoModel extends DetailBaseModel {
 
                     URI uri = new URI(photoURL);
 
-                    ImageUtil.loadImageFromURL(mCtx,uri);
+                    ImageUtil.loadImageFromURL(mCtx,uri,0, 0);
 
                     String filename = ImageUtil.imageCachePath(mCtx,uri);
                     Bitmap bitmap = ImageUtil.adjustPhotoOrientation(filename);

+ 1 - 1
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/detail/model/DetailSignatureModel.java

@@ -59,7 +59,7 @@ public class DetailSignatureModel extends DetailBaseModel {
 
                 try {
 
-                    return ImageUtil.loadImageFromURL(mCtx,new URI(signatureURL));
+                    return ImageUtil.loadImageFromURL(mCtx,new URI(signatureURL),0, 0);
 
                 } catch (URISyntaxException e) {
                     e.printStackTrace();

+ 16 - 4
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/home/HomeOrderModel.java

@@ -5,6 +5,7 @@ import android.graphics.Bitmap;
 import com.usai.redant.apexdrivers.ApexDriverApplication;
 import com.usai.redant.apexdrivers.utils.OperationQueue;
 import com.usai.redant.rautils.utils.ImageUtil;
+import com.usai.redant.rautils.utils.RAUtil;
 
 import java.net.URI;
 
@@ -66,11 +67,22 @@ public class HomeOrderModel {
 
 //                    String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1536134884&di=9ea523019212b373ac04f4411e8aa56b&imgtype=jpg&er=1&src=http%3A%2F%2Fp3.music.126.net%2Fyp-UZgqWp6FV_AN4hPozjQ%3D%3D%2F109951163414711232.jpg";
 //                    String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535609923557&di=ae4e880ba67797a64ccb8336f5fdee3f&imgtype=0&src=http%3A%2F%2Fpic48.nipic.com%2F20140909%2F6608733_105101600000_2.jpg";
-                    Bitmap bitmap = ImageUtil.loadImageFromURL(mCtx,new URI(iconURL));
 
-                    final float scale = mCtx.getResources().getDisplayMetrics().density;
-                    int size = (int) (60 * scale);
-                    bitmap = Bitmap.createScaledBitmap(bitmap, size, size, true);
+                    int size = (int) (RAUtil.dp2px(mCtx,50.0f));
+
+                    Bitmap bitmap = ImageUtil.loadImageFromURL(mCtx,new URI(iconURL), size, size);
+
+
+//                    final float scale = mCtx.getResources().getDisplayMetrics().density;
+
+//                    bitmap = Bitmap.createScaledBitmap(bitmap, size, size, true);
+
+
+//                    Bitmap bitmap = BitmapFactory.decodeResource(mCtx.getResources(), R.drawable.status_new);
+
+//                    size = 2048;
+//                    BitmapZoomOutHelper bitmapZoomOutHelper = new BitmapZoomOutHelper(bitmap);
+//                    bitmap = bitmapZoomOutHelper.zoomOutBitmap(size,size);
 
                     return bitmap;
 

+ 4 - 1
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/update/PhotoPreviewActivity.java

@@ -57,7 +57,10 @@ public class PhotoPreviewActivity extends BasicActivity {
 
         photoPath = getIntent().getStringExtra(PhotoPathKey);
         if (photoPath != null) {
-            Bitmap bitmap = BitmapFactory.decodeFile(photoPath);
+//            Bitmap bitmap = BitmapFactory.decodeFile(photoPath);
+
+            Bitmap bitmap = ImageUtil.adjustPhotoOrientation(photoPath);
+
             previewImageView.setImageBitmap(bitmap);
         }
         canDelete = getIntent().getBooleanExtra(CanDeleteKey,false);

BIN
ApexDrivers/app/src/main/res/drawable-hdpi/status_cancel.png


BIN
ApexDrivers/app/src/main/res/drawable-hdpi/status_delivered.png


BIN
ApexDrivers/app/src/main/res/drawable-hdpi/status_new.png


BIN
ApexDrivers/app/src/main/res/drawable-hdpi/status_on_the_way.png


BIN
ApexDrivers/app/src/main/res/drawable-hdpi/status_reject.png


BIN
ApexDrivers/app/src/main/res/drawable-hdpi/status_returning.png


BIN
ApexDrivers/app/src/main/res/drawable-hdpi/status_wait_confirm.png


BIN
ApexDrivers/app/src/main/res/drawable-hdpi/status_wait_pick_up.png


BIN
ApexDrivers/app/src/main/res/drawable-ldpi/status_cancel.png


BIN
ApexDrivers/app/src/main/res/drawable-ldpi/status_delivered.png


BIN
ApexDrivers/app/src/main/res/drawable-ldpi/status_new.png


BIN
ApexDrivers/app/src/main/res/drawable-ldpi/status_on_the_way.png


BIN
ApexDrivers/app/src/main/res/drawable-ldpi/status_reject.png


BIN
ApexDrivers/app/src/main/res/drawable-ldpi/status_returning.png


BIN
ApexDrivers/app/src/main/res/drawable-ldpi/status_wait_confirm.png


BIN
ApexDrivers/app/src/main/res/drawable-ldpi/status_wait_pick_up.png


BIN
ApexDrivers/app/src/main/res/drawable-mdpi/status_cancel.png


BIN
ApexDrivers/app/src/main/res/drawable-mdpi/status_delivered.png


BIN
ApexDrivers/app/src/main/res/drawable-mdpi/status_new.png


BIN
ApexDrivers/app/src/main/res/drawable-mdpi/status_on_the_way.png


BIN
ApexDrivers/app/src/main/res/drawable-mdpi/status_reject.png


BIN
ApexDrivers/app/src/main/res/drawable-mdpi/status_returning.png


BIN
ApexDrivers/app/src/main/res/drawable-mdpi/status_wait_confirm.png


BIN
ApexDrivers/app/src/main/res/drawable-mdpi/status_wait_pick_up.png


BIN
ApexDrivers/app/src/main/res/drawable-xhdpi/status_cancel.png


BIN
ApexDrivers/app/src/main/res/drawable-xhdpi/status_delivered.png


BIN
ApexDrivers/app/src/main/res/drawable-xhdpi/status_new.png


BIN
ApexDrivers/app/src/main/res/drawable-xhdpi/status_on_the_way.png


BIN
ApexDrivers/app/src/main/res/drawable-xhdpi/status_reject.png


BIN
ApexDrivers/app/src/main/res/drawable-xhdpi/status_returning.png


BIN
ApexDrivers/app/src/main/res/drawable-xhdpi/status_wait_confirm.png


BIN
ApexDrivers/app/src/main/res/drawable-xhdpi/status_wait_pick_up.png


BIN
ApexDrivers/app/src/main/res/drawable-xxhdpi/status_cancel.png


BIN
ApexDrivers/app/src/main/res/drawable-xxhdpi/status_delivered.png


BIN
ApexDrivers/app/src/main/res/drawable-xxhdpi/status_new.png


BIN
ApexDrivers/app/src/main/res/drawable-xxhdpi/status_on_the_way.png


BIN
ApexDrivers/app/src/main/res/drawable-xxhdpi/status_reject.png


BIN
ApexDrivers/app/src/main/res/drawable-xxhdpi/status_returning.png


BIN
ApexDrivers/app/src/main/res/drawable-xxhdpi/status_wait_confirm.png


BIN
ApexDrivers/app/src/main/res/drawable-xxhdpi/status_wait_pick_up.png