Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 圆形鱼眼扭曲扭曲270度,逆时针扭转90度?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个应用程序扭曲位图上的圆圈与鱼眼失真.圆圈似乎旋转了180度并且扭曲了.有任何想法吗?关于为什么在过滤器类中,我没有任何线索.谢谢马特.

import java.io.bufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import com.tecmark.HorizontalSlider.onProgresschangelistener;

import android.content.Context;
import android.graphics.bitmap;
import android.graphics.bitmapFactory;
import android.graphics.bitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.os.Environment;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.onClickListener;
import android.widget.button;
import android.widget.ImageView;

public class TouchView extends View{


    private File tempFile;
    private byte[] imageArray;
    private Bitmap bgr;
    private Bitmap bm;
    private Bitmap bgr2 = null;;
    private Paint pTouch;
    privat@R_618_9473@ centreX = 1;
    privat@R_618_9473@ centreY = 1;
    privat@R_618_9473@ radius = 50;
    privat@R_618_9473@ Progress;
    private static final String TAG = "*********TouchView";
    private Filters f = null;

    public TouchView(Context context) {
        super(context);
       // TouchView(context,null);
    }




    public TouchView(Context context,AttributeSet attr) {
        super(context,attr);




        tempFile = new File(Environment.getExternalStorageDirectory().
                getAbsolutePath() + "/"+"image.jpg");

        imageArray = new byte[(int)tempFile.length()];


     try{

            InputStream is = new FileInputStream(tempFilE);
            BufferedInputStream bis = new BufferedInputStream(is);
            DataInputStream dis = new DataInputStream(bis);


            int i = 0;

            while (dis.available() > 0) {
            imageArraY[i] = dis.readByte();
            i++;
            }

            dis.close();

       } catch (Exception E) {

               e.printStackTrace();
            }



        BitmapFactory.options bfo = new BitmapFactory.options();
        bfo.inSampleSize = 1;

        bm = BitmapFactory.decodeByteArray(imageArray,imageArray.length,bfo);
        bgr = Bitmap.createBitmap(bm.getWidth(),bm.getHeight(),bm.getCon@L_801_3@());
        bgr = bm.copy(bm.getCon@L_801_3@(),truE);
        bgr2 = Bitmap.createBitmap(bm.getWidth(),bm.getCon@L_801_3@());



      f = new Filters();
      //bgr2 = f.barrel(bgr,0.00022F);

        pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);         
        pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT)); 
        pTouch.setColor(Color.TRANSPARENT);
        pTouch.setStyle(Paint.Style.stroke);


    }// end of touchView constructor


    public void findCirclePixels(){ 



    /*  for (int i=centreX-50; i < centreX+50; ++i) {
            for (int y=centreY-50; y <centreY+50 ; ++y) {

    if( Math.sqrt( Math.pow(i - centreX,2) + ( Math.pow(y - centreY,2) ) ) <= radius ){

                    bgr.setPixel(i,y,Color.rgb(Progress+50,Progress,Progress+100));
                }
            }
        }*/
        float prog = (float)Progress/2000000;
        bgr2 = f.barrel(bgr,prog);

        }// end of changePixel()




    @Override
    public Boolean onTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {

            case MotionEvent.ACTION_DOWN: {

                centreX = (int) ev.getX();
                centreY = (int) ev.getY();
                findCirclePixels();
                invalidate();

                break;
            }

            case MotionEvent.ACTION_MOVE: {

                    centreX = (int) ev.getX();
                    centreY = (int) ev.getY();
                    findCirclePixels();
                    invalidate();
                    break;

            }           

            case MotionEvent.ACTION_UP: 

                break;

        }
        return true;
    }//end of onTouchEvent





    public void initSlider(final HorizontalSlider slider)
    {
        Log.e(tag,"******setTing up slider*********** ");
        slider.setOnProgresschangelistener(changelistener);
    }



    private OnProgresschangelistener changelistener = new OnProgresschangelistener() {


        @Override
        public void onProgressChanged(View v,int progress) {
            // TODO Auto-generated method stub

            setProgress(progress);
            Log.e(tag,"***********progress = "+Progress);

        }
    };





    @Override
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);


        canvas.drawBitmap(bgr2,null);
        canvas.drawCircle(centreX,centreY,radius,pTouch);



    }//end of onDraw




    protected void setProgress(int progress2) {
        this.Progress = progress2;
        findCirclePixels();
        invalidate();

    }


}

.

import android.graphics.bitmap;
import android.util.Log;

class Filters{
    float xscale;
    float yscale;
    float xshift;
    float yshift;
    int [] s;
    private String TAG = "Filters";
    public Filters(){

        Log.e(tag,"***********inside constructor");
    }

    public Bitmap barrel (Bitmap input,float k){
        Log.e(tag,"***********inside barrel method ");
        float centerX=input.getWidth()/2; //center of distortion
        float centerY=input.getHeight()/2;

        int width = input.getWidth(); //image bounds
        int height = input.getHeight();

        Bitmap dst = Bitmap.createBitmap(width,height,input.getCon@L_801_3@() ); //output pic
        Log.e(tag,"***********dst bitmap created ");
          xshift = calc_shift(0,centerX-1,centerX,k);
          float newcenterX = width-centerX;
          float xshift_2 = calc_shift(0,newcenterX-1,newcenterX,k);

          yshift = calc_shift(0,centerY-1,centerY,k);
          float newcenterY = height-centerY;
          float yshift_2 = calc_shift(0,newcenterY-1,newcenterY,k);

          xscale = (width-xshift-xshift_2)/width;
          yscale = (height-yshift-yshift_2)/height;
          Log.e(tag,"***********about to loop through bm");
          /*for(int j=0;j<dst.getHeight();j++){
              for(int i=0;i<dst.getWidth();i++){
                float x = geTradialX((float)i,(float)j,k);
                float y = geTradialY((float)i,k);
                sampleImage(input,x,y);
                int color = ((s[1]&0x0ff)<<16)|((s[2]&0x0ff)<<8)|(s[3]&0x0ff);
    //            System.out.print(i+" "+j+" \\");

                dst.setPixel(i,j,color);

              }
            }*/

          int origPixel;

          for(int j=0;j<dst.getHeight();j++){
              for(int i=0;i<dst.getWidth();i++){
                 origPixel= input.getPixel(i,j);
                float x = geTradialX((float)i,y);
                int color = ((s[1]&0x0ff)<<16)|((s[2]&0x0ff)<<8)|(s[3]&0x0ff);
    //            System.out.print(i+" "+j+" \\");

                if( Math.sqrt( Math.pow(i - centerX,2) + ( Math.pow(j - centerY,2) ) ) <= 85 ){
                dst.setPixel(i,color);
                }else{
                    dst.setPixel(i,origPixel);
                }
              }
            }
        return dst;
    }

    void sampleImage(Bitmap arr,float idx0,float idx1)
    {
        s = new int [4];
      if(idx0<0 || idx1<0 || idx0>(arr.getHeight()-1) || idx1>(arr.getWidth()-1)){
        s[0]=0;
        s[1]=0;
        s[2]=0;
        s[3]=0;
        return;
      }

      float idx0_fl=(float) Math.floor(idx0);
      float idx0_cl=(float) Math.ceil(idx0);
      float idx1_fl=(float) Math.floor(idx1);
      float idx1_cl=(float) Math.ceil(idx1);

      int [] s1 = getARGB(arr,(int)idx0_fl,(int)idx1_fl);
      int [] s2 = getARGB(arr,(int)idx1_cl);
      int [] s3 = getARGB(arr,(int)idx0_cl,(int)idx1_cl);
      int [] s4 = getARGB(arr,(int)idx1_fl);

      float x = idx0 - idx0_fl;
      float y = idx1 - idx1_fl;

      s[0]= (int) (s1[0]*(1-X)*(1-y) + s2[0]*(1-X)*y + s3[0]*x*y + s4[0]*x*(1-y));
      s[1]= (int) (s1[1]*(1-X)*(1-y) + s2[1]*(1-X)*y + s3[1]*x*y + s4[1]*x*(1-y));
      s[2]= (int) (s1[2]*(1-X)*(1-y) + s2[2]*(1-X)*y + s3[2]*x*y + s4[2]*x*(1-y));
      s[3]= (int) (s1[3]*(1-X)*(1-y) + s2[3]*(1-X)*y + s3[3]*x*y + s4[3]*x*(1-y));
    }

    int [] getARGB(Bitmap buf,int x,int y){
        int rgb = buf.getPixel(y,X); // Returns by default ARGB.
        int [] scalar = new int[4];
        scalar[0] = (rgb >>> 24) & 0xFF;
        scalar[1] = (rgb >>> 16) & 0xFF;
        scalar[2] = (rgb >>> 8) & 0xFF;
        scalar[3] = (rgb >>> 0) & 0xFF;
        return scalar;
    }

    float geTradialX(float x,float y,float cx,float cy,float k){
      x = (x*xscale+xshift);
      y = (y*yscale+yshift);
      float res = x+((x-cX)*k*((x-cX)*(x-cX)+(y-cy)*(y-cy)));
      return res;
    }

    float geTradialY(float x,float k){
      x = (x*xscale+xshift);
      y = (y*yscale+yshift);
      float res = y+((y-cy)*k*((x-cX)*(x-cX)+(y-cy)*(y-cy)));
      return res;
    }

    float thresh = 1;

    float calc_shift(float x1,float x2,float k){
      float x3 = (float)(x1+(x2-x1)*0.5);
      float res1 = x1+((x1-cX)*k*((x1-cX)*(x1-cX)));
      float res3 = x3+((x3-cX)*k*((x3-cX)*(x3-cX)));

      if(res1>-thresh && res1 < thresh)
        return x1;
      if(res3<0){
        return calc_shift(x3,x2,cx,k);
      }
      else{
        return calc_shift(x1,x3,k);
      }
    }
}

解决方法

你确定没有旋转90°镜像吗?这可能是由于移调X轴和Y轴造成的.例如,我看到你正在调用buf.getPixel(y,X),尽管 Bitmap’s getPixel取x和y而不是y和x.

大佬总结

以上是大佬教程为你收集整理的android – 圆形鱼眼扭曲扭曲270度,逆时针扭转90度?全部内容,希望文章能够帮你解决android – 圆形鱼眼扭曲扭曲270度,逆时针扭转90度?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。