2013.07.25 02:00


안드로이드/Android Rect Class(클래스) 사용 하기 ~!




안드로이드 Rect Class(클래스) 사용 방법 입니다. Rect는 사각형을 만드는 클래스라고 생각하시면 됩니다. View나 특정 공간에 대해 Rect Class(클래스)를 사용하면 범위에 대한 값을 구할 수 있습니다. 


<Rect class 사각형 원리>


Rect Class(클래스)는 위의 그림처럼 4개의 점들이 모여서 하나의 사각형을 이루는 구조를 가지고 있습니다. 자 그럼 예제를 살펴 보겠습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package arabiannight.tistory.com.rectclass;
 
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
 
public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         
        CustomView cv = new CustomView(this);
        setContentView(cv);
         
    }
     
    class CustomView extends View {
 
        public CustomView(Context context) {
            super(context);
        }
         
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
             
            // Rect 클래스를 만든다. (사각형)
            Rect rect = new Rect();
            // View의 사이즈 만큼 Rect를 그려 준다.
            rect.set(0, 0, canvas.getWidth(), canvas.getHeight());
 
            // 페인트 객체 생성
            Paint paint = new Paint();
            paint.setColor(Color.YELLOW);
            paint.setStyle(Paint.Style.FILL);
 
            // Rect에 Yellow 색을 칠해 준다.
            canvas.drawRect(rect, paint);
             
            // Rect Size
            Log.d("RECT", "left : " + rect.left);
            Log.d("RECT", "right : " + rect.right);
            Log.d("RECT", "top : " + rect.top);
            Log.d("RECT", "bottom : " + rect.bottom);
        }
    }
}



Posted by injunech
2013.07.25 02:00


안드로이드에서 이미지를 사용하기 위해서, 보통 Bitmap 클래스를 사용하게 됩니다. 안드로이드 앱에서 이미지에 대한 Thumbnail이나 이미지의 부분을 자르기 위해서는 Bitmap 클래스로 원하는 사이즈나 원하는 부분을 쉽게 잘라낼 수 있습니다. 

아래의 BitmapUtil 클래스는, Bitmap 클래스를 이용해서 이미지를 줄이거나 늘리는 기능을 제공하는 유틸리티 클래스입니다. 아래의 기능정도면, 정말 특이한 요구사항(우측아래를 기준으로 100x100 이미지를 가져와라, 이런건 간단하게 아래의 cropCenter 메쏘드를 약간 변경하면 쉽게 적용)이 없다면, 아래의 유틸리티 클래스만으로도 상당히 많은 부분을 커버할 수 있을것 같습니다.. 

import android.graphics.Bitmap;

/**
 * BitmapUtil Class
 * 
 * @Author : mcsong@gmail.com
 * @Date : Mar 11, 2012 9:59:18 AM
 * @Version : 1.0.0
 */
public class BitmapUtil {    
    /**
     * Bitmap을 ratio에 맞춰서 max값 만큼 resize한다.
     *  
     * @param Bitmap 원본 
     * @param max 원하는 크기의 값
     * @return
     */
    public static Bitmap resizeBitmap(Bitmap src, int max) {
        if(src == null)
            return null;
        
        int width = src.getWidth();
        int height = src.getHeight();
        float rate = 0.0f;
        
        if (width > height) {
            rate = max / (float) width;
            height = (int) (height * rate);
            width = max;
        } else {
            rate = max / (float) height;
            width = (int) (width * rate);
            height = max;
        }

        return Bitmap.createScaledBitmap(src, width, height, true);            
    }
    
    /**
     * Bitmap을 ratio에 맞춰서 max값 만큼 resize한다.
     * 
     * @param src
     * @param max 
     * @param isKeep 작은 크기인 경우 유지할건지 체크..  
     * @return
     */
    public static Bitmap resize(Bitmap src, int max, boolean isKeep) {
        if(!isKeep)
            return resizeBitmap(src, max);
        
        int width = src.getWidth();
        int height = src.getHeight();
        float rate = 0.0f;
        
        if (width > height) {
            if (max > width) {
                rate = max / (float) width;
                height = (int) (height * rate);
                width = max;
            }
        } else {
            if (max > height) {
                rate = max / (float) height;
                width = (int) (width * rate);
                height = max;
            }
        }

        return Bitmap.createScaledBitmap(src, width, height, true);
    }
    
    /**
     * Bitmap 이미지를 정사각형으로 만든다.
     * 
     * @param src 원본 
     * @param max 사이즈
     * @return
     */
    public static Bitmap resizeSquare(Bitmap src, int max) {
        if(src == null)
            return null;
        
        return Bitmap.createScaledBitmap(src, max, max, true);
    }
    
    
    /**
     * Bitmap 이미지를 가운데를 기준으로 w, h 크기 만큼 crop한다. 
     * 
     * @param src 원본
     * @param w 넓이
     * @param h 높이
     * @return
     */
    public static Bitmap cropCenterBitmap(Bitmap src, int w, int h) {
        if(src == null)
            return null;
        
        int width = src.getWidth();
        int height = src.getHeight();
                
        if(width < w && height < h)
            return src;
        
        int x = 0;
        int y = 0;
        
        if(width > w)
            x = (width - w)/2;
        
        if(height > h)
            y = (height - h)/2;
        
        int cw = w; // crop width
        int ch = h; // crop height
        
        if(w > width)
            cw = width;
        
        if(h > height)
            ch = height;
        
        return Bitmap.createBitmap(src, x, y, cw, ch);
    }
    
}




Posted by injunech
2013.07.22 17:00


StretchBlt 함수


이미지의 크기를 조절하여 화면에 출력해주는 함수입니다.


BitBlt 함수에서 불가능한 이미지 크기를 조절해서 출력할 수 있습니다.


이미지 크기를 조절할 때 생가는 색상의 손실을 SetStretchBltMode 함수를 사용하여 보정하는 것이 좋습니다.


이 함수를 쓰기 전에 먼저 비트맵 파일을 LoadImage 함수나 다른 방법을 이용하여 불러와야 합니다.




함수 원형


BOOL StretchBlt(

    HDC hdcDest,

    int nXOriginDest,

    int nYOriginDest,

    int nWidthDest,

    int nHeightDest,

    HDC hdcSrc,

    int nXOriginSrc,

    int nYOriginSrc,

    int nWidthSrc,

    int nHeightSrc,

    DWORD dwRop);




인수


hdcDest

이미지를 출력할 위치의 핸들입니다.


nXOriginDest, nYOriginDest

이미지를 출력할 위치인 x, y 좌표입니다.


nWidthDest, nHeightDest

출력할 이미지의 너비, 높이입니다.

이 크기만큼 hdcSrc로부터 받은 이미지를 이 너비와 높이에 맞게 이미지 크기를 변경합니다.


hdcSrc

이미지의 핸들입니다.


nXOriginSrc, nYOriginSrc

가져올 이미지의 시작지점인 x, y좌표입니다.

지정한 위치부터 nWidthSrcnHeightSrc만큼 이미지를 잘라옵니다.


nWidthSrc, nHeightSrc

원본 이미지로부터 해당 크기만큼 잘라낼 이미지의 너비, 높이입니다.

이 크기만큼 원본 이미지에서 잘라내어 nWidthDestnHeightDest의 크기에 맞게 이미지 크기를 변경합니다.


dwRop

이미지의 출력 방법입니다.


 값

 설명

 BLACKNESS

 이미지를 원본의 색이 아닌 검은색으로 채웁니다.

 DSTINVERT

 지정된 이미지와는 상관없이 화면의 색상을 반전시킵니다.

 MERGECOPY

 이미지의 색상과 현재 선택된 브러시를 AND 연산자를 사용하여 병합합니다.

 MERGEPAINT

 반전된 이미지와 화면의 색을 OR 연산자를 사용하여 병합합니다.

 NOMIRRORBITMAP

 Prevents the bitmap from being mirrored.

 NOTSRCCOPY

 이미지의 색상을 반전시킵니다.

 NOTSRCERASE

 화면과 이미지를 OR 연산자를 사용하여 합친 다음 색상을 반전시킵니다.

 PATCOPY

 현재 선택된 브러시를 출력합니다.

 PATINVERT

 현재 선택된 브러시 색과 화면을 XOR 연산자를 사용하여 결합합니다.

 PATPAINT

 현재 선택된 브러시 색과 반전된 원본 이미지를 OR 연산자를 사용하여 결합합니다.

 그다음 OR 연산자를 사용하여 화면과 결합합니다.

 SRCAND

 화면과 이미지를 AND 연산자를 사용하여 결합합니다.

 SRCCOPY

 원본 이미지를 출력합니다.

 SRCERASE

 반전된 화면과 이미지를 AND 연산자를 사용하여 결합합니다.

 SRCINVERT

 화면과 이미지를 XOR 연산자를 사용하여 결합합니다.

 SRCPAINT

 화면과 이미지를 OR 연산자를 사용하여 결합합니다.

 WHITENESS

 이미지를 원본의 색이 아닌 하얀색으로 채웁니다.




요구 사항


 운영체제

 Windows 2000 이상

 헤더

 Wingdi.h (include Windows.h)

 라이브러리

 Gdi32.lib

 DLL

 Gdi32.dll




예제


이 예제는 WinMain의 기본 구성에서 WndProc 부분에 그대로 복사하시면 됩니다.


난잡해서 이해가 잘 안가신다면 첨부파일을 참고해주세요.


//---------------------------------------------------------//

// 프로그램의 실질적이고 고유한 처리를 하는 곳

//---------------------------------------------------------//

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

    HDC hdc;

    PAINTSTRUCT ps;

    HDC hMemDC;

     HBITMAP hImage, hOldBitmap;

    int bx, by;

    BITMAP bit;

    LPCWSTR str;


    switch (iMessage)

    {

    case WM_PAINT:

        hdc = BeginPaint(hWnd, &ps);

        hMemDC = CreateCompatibleDC(hdc); // 메모리 DC를 만든다


        // 비트맵 속성으로 파일을 불러오고 HBITMAP으로 형변환해서 hImage에 저장한다

        // fuLoad 속성: 리소스 대신 파일명으로, 호환 비트맵이 아닌 DIB 섹션 비트맵으로 불러온다

        hImage = (HBITMAP) LoadImage(NULL, TEXT("image.bmp"),

             IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);


        // hImage가 선택되기 전의 핸들을 저장해 둔다

        hOldBitmap = (HBITMAP) SelectObject(hMemDC, hImage);


        // 비트맵 정보를 알아낸다

        GetObject(hImage, sizeof(BITMAP), &bit);

        bx = bit.bmWidth;

        by = bit.bmHeight;


        // 원본

        str = TEXT("원본");

        TextOut(hdc, 50, 30, str, lstrlen(str));


        BitBlt(hdc, 50, 50, bx, by, hMemDC, 0, 0, SRCCOPY);


        // 1.5

        str = TEXT("1.5");

        TextOut(hdc, 450, 30, str, lstrlen(str));


        StretchBlt(hdc, 450, 50, bx * 1.5, by * 1.5, hMemDC, 0, 0, bx, by, SRCCOPY);


        // 1.5배 / 0.5배 설명

        str = TEXT("1.5/ 0.5");

        TextOut(hdc, 50, 360, str, lstrlen(str));


        // BLACKONWHITE(기본 설정)

        str = TEXT("BLACKONWHITE(기본 설정)");

        TextOut(hdc, 50, 380, str, lstrlen(str));


        SetStretchBltMode(hdc, BLACKONWHITE);

        StretchBlt(hdc, 50, 400, 100, 100, hMemDC, 120, 70, 70, 70, SRCCOPY); // 부분 확대

        StretchBlt(hdc, 155, 400, bx * 0.5, by * 0.5, hMemDC, 0, 0, bx, by, SRCCOPY); // 축소


        // COLORONCOLOR

        str = TEXT("COLORONCOLOR");

        TextOut(hdc, 450, 380, str, lstrlen(str));


        SetStretchBltMode(hdc, COLORONCOLOR);

        StretchBlt(hdc, 450, 400, 100, 100, hMemDC, 120, 70, 70, 70, SRCCOPY);

        StretchBlt(hdc, 555, 400, bx * 0.5, by * 0.5, hMemDC, 0, 0, bx, by, SRCCOPY);


        // HALFTONE

        str = TEXT("HALFTONE");

        TextOut(hdc, 50, 530, str, lstrlen(str));


        SetStretchBltMode(hdc, HALFTONE);

        StretchBlt(hdc, 50, 550, 100, 100, hMemDC, 120, 70, 70, 70, SRCCOPY);

        StretchBlt(hdc, 155, 550, bx * 0.5, by * 0.5, hMemDC, 0, 0, bx, by, SRCCOPY);


        // WHITEONBLACK

        str = TEXT("WHITEONBLACK");

        TextOut(hdc, 450, 530, str, lstrlen(str));


        SetStretchBltMode(hdc, WHITEONBLACK);

        StretchBlt(hdc, 450, 550, 100, 100, hMemDC, 120, 70, 70, 70, SRCCOPY);

        StretchBlt(hdc, 555, 550, bx * 0.5, by * 0.5, hMemDC, 0, 0, bx, by, SRCCOPY);


        SelectObject(hMemDC, hOldBitmap); // hImage 선택을 해제하기 위해 hOldBitmap을 선택한다

        DeleteObject(hImage); // 선택 해제된 비트맵을 제거한다

        DeleteDC(hMemDC); // 메모리 DC를 제거한다

        EndPaint(hWnd, &ps);

        return 0;


    case WM_DESTROY:

        PostQuitMessage(0);

        return 0;

    }

    // WinProc에서 처리하지 않는 나머지 메시지를 윈도우 기본으로 처리하도록 전달

    return(DefWindowProc(hWnd, iMessage, wParam, lParam));

}




결과


* 이미지를 클릭해서 원본으로 보세요.





출처: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145120(v=vs.85).aspx



Posted by injunech