ScorllView에 ImageView를 넣었을 때 위 아래로 여백이 생기는 것을 확인했습니다.

이를 제거하기 위해 ScaleType을 모두 적용했지만 원하는데로 적용되지 않았습니다.


해결 방법은 간단합니다.

스크롤 뷰, 이미지 뷰 레이아웃 너비, 높이를 모두 match_parent로 설정하고

이미지 뷰에 다음과 같이 추가합니다.


android:adjustViewBounds="true"


이미지 보다 레이아웃이 더 클 때 비율을 유지하는 여부를 묻는 속성입니다.

true로 설정하면 이미지가 레이아웃에 딱 맞게 설정되어 표시됩니다.


아래 전체 xml 코드입니다.


<ScrollView

android:layout_width="match_parent"

android:layout_height="match_parent">

<ImageView

android:src="@drawable/..."

android:layout_width="match_parent"

android:layout_height="match_parent"

android:adjustViewBounds="true"/>

</ScrollView>


이상 이미지 뷰 여백 없애기였습니다.




정보가 유익하셨다면 아래 공감버튼 눌러주시면 감사하겠습니다.

질문사항은 댓글로 달아주시면 성의껏 답변해드리겠습니다.




SeekBar를 이용한 카메라 줌인, 줌아웃 기능 제어하는 방법입니다.


먼저 Layout입니다.


<SeekBar

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/zoom"

android:max="10" />


id는 Activity에서 사용할 id로 설정해주시면 되고, max는 최대 크기입니다. 10으로 설정 시 1~10까지 seekbar의 칸이 분리됩니다.


다음 Activity입니다.


ZoomseekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

@Override

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

int Zoom = progress * 6;


if(CameraPreview.params.getMaxZoom() < Zoom) {

Zoom = CameraPreview.params.getMaxZoom();

}

CameraPreview.params.setZoom(Zoom);

CameraPreview.mCamera.setParameters(CameraPreview.params);

}


@Override

public void onStartTrackingTouch(SeekBar seekBar) { }

@Override

public void onStopTrackingTouch(SeekBar seekBar) { }

});


SeekBar의 값 변경 시 호출되는 onProgressChanged 함수에서 처리해주시면 됩니다.

휴대폰 기종마다 지원되는 줌 크기가 다르기 때문에

Parameter의 getMaxZoom() 함수를 통해 최대 줌 크기값을 받아 올 수 있습니다.

제 기종의 경우 MaxZoom 값이 60이 나오네요.

애초에 SeekBar의 max 크기를 10으로 주었기 때문에,

Zoom값은 progress * 6 으로 설정했습니다.


setZoom()을 통해 줌 값을 넘겨주고, 파라미터 설정을 해주면 CameraPreview에서 정상 작동하는것을 확인 할 수 있습니다.

 


참고 : 

안드로이드 SurfaceView 카메라 연동

안드로이드 SurfaceView 화면 캡쳐



정보가 유익하셨다면 아래 공감버튼 눌러주시면 감사하겠습니다.

질문사항은 댓글로 달아주시면 성의껏 답변해드리겠습니다.



비트맵 이진화 처리 함수입니다.

먼저 비트맵을 받아 복사한 후

모든 픽셀을 탐색하며 색깔을 변경해줍니다.(GetNewColor)

그리고 새로운 비트맵을 반환합니다.


private Bitmap GetBinaryBitmap(Bitmap bitmap_src) {

    Bitmap bitmap_new=bitmap_src.copy(bitmap_src.getConfig(), true);

    for(int x=0; x<bitmap_new.getWidth(); x++) {

        for(int y=0; y<bitmap_new.getHeight(); y++) {

            int color=bitmap_new.getPixel(x, y);

            color=GetNewColor(color);

            bitmap_new.setPixel(x, y, color);

        }

    }

    return bitmap_new;

}


GetNewColor 함수입니다.

GetColorDistance 함수를 통해 흰색과 검정색 중 가까운 색깔을 선택합니다.

BLACK 부분에 0.4를 곱해 BLACK 값을 높여서 좀 더 어두운 환경에서도 이진화를 잘 수행할 수 있도록 했습니다.

흰색 또는 검정색(이진화 값)을 반환합니다.


private int GetNewColor(int c) {

    double dwhite=GetColorDistance(c,Color.WHITE);

    double dblack=GetColorDistance(c,Color.BLACK)*0.4;

    if(dwhite<=dblack) {

        return Color.WHITE;

    }

    else {

        return Color.BLACK;

    }

}


GetColorDistance 함수입니다.

R,G,B 값을 받아와 제곱의 합의 제곱근입니다.(거리 구하는 공식)

거리 값을 반환합니다.


private double GetColorDistance(int c1, int c2) {

    int db= Color.blue(c1)-Color.blue(c2);

    int dg=Color.green(c1)-Color.green(c2);

    int dr=Color.red(c1)-Color.red(c2);

    double d=Math.sqrt(  Math.pow(db, 2) + Math.pow(dg, 2) +Math.pow(dr, 2)  );

    return d;

}


실행 결과입니다.


GetNewColor 함수의 BLACK 및 WHITE값을 적절히 조절하여 최적의 이진화 된 이미지를 얻을 수 있습니다.

이진화 된 이미지를 통해 OCR을 더욱 효과적으로 처리할 수 있습니다.



질문 및 오류사항은 댓글로 달아주세요.



to Top