2012-05-19 3 views
5

나는 큰 사이즈의 이미지로 작업하고 있는데, 회전하려고 할 때 (applying matrix on the bitmap) 많은 시간이 걸린다. 안드로이드 시스템 갤러리가 매우 빠른 방법으로이 작업을 수행 할 수 있다는 것을 보았습니다. 그게 어떻게 가능해?큰 사이즈의 비트 맵을 회전시키는 가장 빠른 방법

주 스레드에서 ImageView 회전 (오랜 시간이 걸리지 않음) 만 적용하여 asyncTask를 회전하려고 생각했지만 asyncTask가 끝나기 전에 응용 프로그램이 종료되면 응용 프로그램이 종료됩니다 일관성없는 상태로 큰 이미지 변형을 할 때

Matrix mat = new Matrix(); 
mat.setRotate(90); 
bMap = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), mat, true); 

답변

3

, 그것의 낮은 품질의 비트 맵 복사본을 생성하고 즉시 회전을 나타 내기위한 용도 :

큰 비트 맵 장시간 실행을 얻어 내 비트 맵 회전 코드이며 또는 다른 편집 효과. 사용자가 멈 추면 (또는 왼쪽 슬라이더 컨트롤) 동일한 효과를 적용한 원본 이미지로 저품질 비트 맵을 교체하십시오. 이렇게하면 사용자 경험이 크게 향상됩니다. 시도하고 알려주세요.

이것은 원래 요구 사항에서 벗어난 것처럼 들릴 수 있습니다. 전체 이미지를 실시간으로 회전하는 대신 사각형을 그릴 수 있습니다. 결국, 사용자가 필요로하는 것은 그의 이미지가 얼마나 회전했는지를 나타내는 것입니다. 이것은 더 빠르며 지체없이 UI 스레드에서 쉽게 수행 할 수 있습니다.

이 캔버스 코드

canvas.save(); //save the position of the canvas 
canvas.rotate(angle, X + (imageW/2), Y + (imageH/2)); //rotate the canvas 
canvas.drawBitmap(imageBmp, X, Y, null); //draw the image on the rotated canvas 
canvas.restore(); // restore the canvas position. 
+0

이것은 물론, 사용자 경험을 개선하는 것이 좋습니다에 대한 간단한 회전이다. 하지만 주된 문제는 마지막에 원본 이미지를 작업 할 때 작업을 완료하는 데 많은 시간이 걸릴 수 있으며 이러한 복잡한 문제가 있다는 것입니다. - 주 스레드에서 작업을 수행하는 경우 사용자가 대기해야합니다. - asyncTask에서 작업을 수행하면 응용 프로그램이 완료되기 전에 종료해야 변경 사항이 손실됩니다. –

+0

이것은 원래 요구 사항의 편차처럼 들릴 수 있습니다. 실시간으로 전체 이미지를 회전하는 대신 사각형을 그릴 수 있습니다. . 결국 사용자가 필요로하는 것은 이미지가 얼마나 회전했는지를 나타내는 것입니다. 이것은 느리고 쉽게 UI 스레드에서 지연없이 이루어질 것입니다. – Ronnie

+0

오해로 인해 미안합니다. 제 질문은 "시스템 갤러리에서 할 수있는 것처럼 빠른 방법으로 비트 맵 회전을 수행하는 방법"입니다. 어쨌든 나는 너의 힌트로 많은 혼란스러워한다. 내가 결국 필요한 것은 사용자가 말한 것처럼 회전에 대한 표시를 제공하지 않고 큰 크기의 비트 맵에서 회전을 수행하는 것입니다. 갤러리에서 허용하는 것처럼 90, 180, 270, 360도 회전 만 허용합니다. 양해 해 주셔서 감사합니다. :) –

관련 문제