728x90
오늘은
비트맵 합치기
https://stickode.tistory.com/948
사람 배경 만들기
https://stickode.tistory.com/949
에 이어서 필터만들기를 해보겠습니다. 코드에 사용된 코드에 대한 설명은 위에 글들에 있으니 한번씩 보고 와주세요 ㅎ
먼저 java 코드입니다.
MainActivity
public class MainActivity extends AppCompatActivity {
// 필요한 뷰 및 비트맵 변수 선언
ImageView imageView, imageView3; // 이미지뷰 변수 선언
Bitmap bitmap1; // 비트맵 변수 선언
Button ImageCover; // 버튼 변수 선언
// 액티비티 생성 시 호출되는 메서드
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 레이아웃 설정
setContentView(R.layout.activity_main);
// 뷰와 버튼 초기화
imageView = findViewById(R.id.imageView); // imageView에 레이아웃에서 정의한 뷰 연결
imageView3 = findViewById(R.id.imageView3); // imageView3에 레이아웃에서 정의한 뷰 연결
ImageCover = findViewById(R.id.ImageCover); // ImageCover에 레이아웃에서 정의한 버튼 연결
// 첫 번째 이미지뷰에 비트맵 설정
bitmap1 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.img_3); // 비트맵을 이미지 리소스에서 로드
imageView.setImageBitmap(bitmap1); // imageView에 비트맵 설정
// 버튼에 클릭 리스너 등록
ImageCover.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 첫 번째 이미지뷰에서 비트맵을 가져옴
BitmapDrawable drawable1 = (BitmapDrawable) imageView.getDrawable();
Bitmap dst = drawable1.getBitmap();
// 새로운 비트맵 생성 (크기는 원본 이미지와 동일)
Bitmap segmentedBitmap = Bitmap.createBitmap(dst.getWidth(), dst.getHeight(), Bitmap.Config.ARGB_8888);
// 두 번째 이미지뷰에서 비트맵을 가져옴
BitmapDrawable drawable2 = (BitmapDrawable) imageView.getDrawable();
Bitmap dst_ = drawable2.getBitmap();
// 필터 색상 배열 생성
int[] fliterColor = filterColors(dst_.getWidth(), dst_.getHeight());
// 필터된 비트맵 생성
Bitmap filterBitmap = Bitmap.createBitmap(fliterColor, dst_.getWidth(), dst_.getHeight(), Bitmap.Config.ARGB_8888);
// 캔버스 생성하여 이미지를 그림
Canvas canvas = new Canvas(segmentedBitmap);
Paint paint = new Paint();
canvas.drawBitmap(dst_, 0, 0, paint);
// 필터링된 이미지를 SRC_OVER 모드로 그림
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));
canvas.drawBitmap(filterBitmap, 0, 0, paint);
// 두 번째 이미지뷰에 필터링된 이미지 설정
imageView3.setImageBitmap(dst_);
imageView3.setImageBitmap(segmentedBitmap);
}
});
}
@ColorInt
private int[] filterColors(int maskWidth, int maskHeight) {
@ColorInt int[] colors = new int[maskWidth * maskHeight];
for (int i = 0; i < maskWidth * maskHeight; i++) {
// 색상 배열을 색상 값으로 초기화 (투명도: 128, 빨강: 255, 녹색: 0, 파랑: 255)
colors[i] = Color.argb(128, 255, 0, 255);
}
return colors;
}
}
layout xml 코드입니다.
activity_main
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="200dp"
android:layout_height="200dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@tools:sample/avatars" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="300dp"
android:layout_height="300dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView"
tools:srcCompat="@tools:sample/avatars" />
<Button
android:id="@+id/ImageCover"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="필터"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
결과물입니다.
'안드로이드 자바' 카테고리의 다른 글
[JAVA][Android] 리사이클러뷰 드래그엔 드롭 위치 수정 (0) | 2023.11.06 |
---|---|
[JAVA][Android] BadgeDrawable을 활용하여 바텀 네비게이션 바에 뱃지 구현(수정본) (0) | 2023.10.22 |
[Java][Android] floating layout 라이브러리 사용해보기(수정본) (0) | 2023.10.11 |
[Android][Java] Retrofit 라이브러리를 사용해서 서버에 파일 업로드하기(클라이언트) (0) | 2023.10.09 |
[Android][java] 바인딩 서비스와 플래그 (0) | 2023.10.07 |