PHP直播系统源码图片合成的原理

/**
* 如何将PHP直播系统源码中的2张图片合成
* @param downBitmap 底部图片
* @param upBitmap 置顶的图片
* @return
*/
public Bitmap compoundBitmap(Bitmap downBitmap,Bitmap upBitmap)

 {
        if(downBitmap == null || upBitmap == null) {
            return null;
        }
        Bitmap mBitmap = downBitmap.copy(Bitmap.Config.ARGB_8888, true);
        Bitmap  upNewBitmap = upBitmap;
        //如果遇到黑色,则显示downBitmap里面的颜色值,如果不是则显示upBitmap里面的颜色值
        //循环获得bitmap所有像素点
        int mBitmapWidth = mBitmap.getWidth();
        int mBitmapHeight = mBitmap.getHeight();
        //首先保证downBitmap和 upBitmap是一致的高宽大小
        if (DEBUG) {
            Log.d("may", "mBitmapWidth=" + mBitmapWidth + ",upBitmap.getWidth()=" + upBitmap.getWidth());
            Log.d("may", "mBitmapHeight=" + mBitmapHeight + ",upBitmap.getHeight()=" + upBitmap.getHeight());
        }
        if(mBitmapWidth != upBitmap.getWidth()  || mBitmapHeight != upBitmap.getHeight()) {
            upNewBitmap = resizeImage(upBitmap, mBitmapWidth, mBitmapHeight);
        }
        if(mBitmapWidth==upBitmap.getWidth() && mBitmapHeight==upBitmap.getHeight())
        {
            if (DEBUG)
            Log.d("may", "compoundBitmap mBitmapWidth==upBitmap.getWidth()");
            for (int i = 0; i < mBitmapHeight; i++) {
                for (int j = 0; j < mBitmapWidth; j++) {
                    //获得Bitmap 图片中每一个点的color颜色值
                    //将需要填充的颜色值如果不是
                    //在这说明一下 如果color 是全透明 或者全黑 返回值为 0
                    //getPixel()不带透明通道 getPixel32()才带透明部分 所以全透明是0x00000000
                    //而不透明黑色是0xFF000000 如果不计算透明部分就都是0了
                    int color = upNewBitmap.getPixel(j, i);
                    //将颜色值存在一个数组中 方便后面修改
                    if (color != Color.BLACK ) {
                        if(color != 0x00000000 ) {
                            mBitmap.setPixel(j, i, upNewBitmap.getPixel(j, i));
                        }
                    } else {
                        mBitmap.setPixel(j, i, 0x00000000);
                    }

                }
            }
        }
//        downBitmap.recycle();
//        upBitmap.recycle();
        return mBitmap;
    }

//使用Bitmap加Matrix来缩放

public Bitmap resizeImage(Bitmap bitmap, int w, int h) {
Bitmap BitmapOrg = bitmap;
int width = BitmapOrg.getWidth();
int height = BitmapOrg.getHeight();
int newWidth = w;
int newHeight = h;

float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;

Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// if you want to rotate the Bitmap
// matrix.postRotate(45);
Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 0, 0, width,
        height, matrix, true);
//return new BitmapDrawable(resizedBitmap);
return resizedBitmap;

}

/*
PHP直播系统源码两张图片合成一张图片
*/
private Bitmap mergeBitmap(Bitmap firstBitmap, Bitmap secondBitmap) {
Bitmap bitmap = Bitmap.createBitmap(firstBitmap.getWidth(), firstBitmap.getHeight(),
firstBitmap.getConfig());
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(firstBitmap, new Matrix(), null);
// canvas.drawBitmap(firstBitmap,0, 0,null);
canvas.drawBitmap(secondBitmap, 0, 0, null);
return bitmap;
}

private Bitmap mergePhoto(Bitmap firstBitmap, Bitmap secondBitmap) {
    // 防止出现Immutable bitmap passed to Canvas constructor错误

// Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),
// R.drawable.apple).copy(Bitmap.Config.ARGB_8888, true);
// Bitmap bitmap2 = ((BitmapDrawable) getResources().getDrawable(
// R.drawable.go)).getBitmap();

    Bitmap bitmap = Bitmap.createBitmap(firstBitmap.getWidth(), firstBitmap.getHeight(),
            firstBitmap.getConfig());
    Bitmap newBitmap = null;
    newBitmap = Bitmap.createBitmap(bitmap);
    Canvas canvas = new Canvas(newBitmap);
    Paint paint = new Paint();
    int w = firstBitmap.getWidth();
    int h = firstBitmap.getHeight();
    int w_2 = secondBitmap.getWidth();
    int h_2 = secondBitmap.getHeight();
    paint.setColor(Color.GRAY);
    paint.setAlpha(125);
    canvas.drawRect(0, 0, firstBitmap.getWidth(), firstBitmap.getHeight(), paint);
    paint = new Paint();
    canvas.drawBitmap(secondBitmap, Math.abs(w - w_2) / 2,
            Math.abs(h - h_2) / 2, paint);
    canvas.save(Canvas.ALL_SAVE_FLAG);
    // 存储新合成的图片
    canvas.restore();
    return newBitmap;
}

/*
从资源中获取的Drawable --> Bitmap
mContext
*/
private Bitmap drawbleChangetoBitmap(int redId, Context context) {
Resources res = context.getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, redId);
return bmp;
}

/**
* PHP直播系统源码把图片转成圆形图片
* 这个暂时没有用
* @param bitmap
* @return
*/

private Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
    if(bitmap == null) {
        return null;
    }
    Bitmap roundBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(roundBitmap);
    int color = 0xff424242;
    Paint paint = new Paint();
    Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    RectF rectF = new RectF(rect);
    float roundPx = 50;
    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);
    return roundBitmap;
}

/**
*PHP直播系统源码 转换图片成圆形
* @param bitmap 传入Bitmap对象
* @return
*/

 public static Bitmap toRoundBitmap(Bitmap bitmap) {
        if(bitmap == null) {
            return null;
        }
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float roundPx;
        float left,top,right,bottom,dst_left,dst_top,dst_right,dst_bottom;
        if (width <= height) {
            roundPx = width / 2;
            top = 0;
            bottom = width;
            left = 0;
            right = width;
            height = width;
            dst_left = 0;
            dst_top = 0;
            dst_right = width;
            dst_bottom = width;
        } else {
            roundPx = height / 2;
            float clip = (width - height) / 2;
            left = clip;
            right = width - clip;
            top = 0;
            bottom = height;
            width = height;
            dst_left = 0;
            dst_top = 0;
            dst_right = height;
            dst_bottom = height;
        }
        Bitmap output = Bitmap.createBitmap(width,
                height, Bitmap.Config.ARGB_8888);
        if(output == null) {
            return null;
        }
        Canvas canvas = new Canvas(output);
        // final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect src = new Rect((int)left, (int)top, (int)right, (int)bottom);
        final Rect dst = new Rect((int)dst_left, (int)dst_top, (int)dst_right, (int)dst_bottom);
        final RectF rectF = new RectF(dst);
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        // paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, src, dst, paint);
        return output;
    }

private static int mRoundedRate = 10;

/**
* 1.做圆角处理(椭圆)
* 2.增加背景色
* @param src
* @param iconSize
* @return
*/
private static Bitmap addBorderToImage(Bitmap src, int iconSize) {

if(src == null) {
return null;
}
int width = iconSize;//getBorderWidth();
int height = iconSize;//getBorderHeight();

Bitmap output = Bitmap.createBitmap(width, height,
        Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
RectF outerRect = new RectF(0,0,width,height);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);

LinearGradient mLinearGradientClamp = new LinearGradient(0, 0, 0, height, new int[] {getCenterTopColor(src),getCenterBottomColor(src)}, null, Shader.TileMode.CLAMP);
paint.setShader(mLinearGradientClamp);
canvas.drawRoundRect(outerRect, width/mRoundedRate, height/mRoundedRate, paint);

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
int sw = src.getWidth();
int sh = src.getHeight();

Rect srcRect = new Rect(0,0,sw,sh);
Rect dstRect = getDstRect(sw,sh,width,height);

canvas.drawBitmap(src, srcRect, dstRect, paint);
return output;

/**
* 1.填充背景色
* 2.转换成圆形
* @param src
* @param iconSize
* @return
*/

    public static Bitmap addBorderToRoundImage(Bitmap src, int iconSize) {
        Bitmap icon = addBorderToImage(src, iconSize);
        return toRoundBitmap(icon);
    }


    private static Rect getDstRect( int sw,int sh,int w,int h){
        return new Rect(0,0,w,h);
    }

    /**
     * 得到原始图片中,底部中间的第一个完全不透明的颜色
     * @return
     */
    private static int getCenterTopColor(Bitmap src){
        int w = src.getWidth();
        int h = src.getHeight();
        int x = (int) (w*0.5);
        int c = Color.WHITE;
        for(int y =h-1;y>=0;--y){
            int pixel = src.getPixel(x, y);
            if(Color.alpha(pixel)==0xFF){
                c = pixel;
            }
        }
        return c;
//        return softColor(c);
    }
/**
 * 得到原始图片中,顶部中间的第一个完全不透明的颜色
 * @return
 */
private static int getCenterBottomColor(Bitmap src){
    int w = src.getWidth();
    int h = src.getHeight();
    int x = (int) (w*0.5);
    int c = Color.WHITE;
    for(int y =0;y<h;++y){
        int pixel = src.getPixel(x, y);
        if(Color.alpha(pixel)==0xFF){
            c = pixel;
        }
    }
    return c;

// return softColor©;
}
/**
* 将颜色变浅,变淡 一旦使用此方法,边框颜色会对应不上,故上面两个方法没有使用
* @param color
* @return
*/
private static int softColor(int color){
int r = (int) (Color.red(color)*1.3);
int b = (int) (Color.blue(color)*1.3);
int g = (int) (Color.green(color)*1.3);
int af = 0xFF;
if(b >= 0xFF){
b = 0xFF;
}
if(r>=0xFF){
r = 0xFF;
}
if(g>=0xFF){
g = 0xFF;
}
return af<<24|r<<16|g<<8|b;
}

发布了150 篇原创文章 · 获赞 65 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/yb1314111/article/details/105136360