[질문]bmp나 jpg 파일 일부분만만 잘라내서 저장하기
고수님들의 도움을 부탁드립니다.
bmp파일을 image1에 불러들인후
mouse로 일부분만을 선택한후에 선택된 부분만
다시 파일로 저장할려구 하거든요.
그래서 우선 image1에 bmp 파일을 불러들인후
mouse로 사각형을 그리고 그린부분만큼을
canvas.copyrect를 써서 image2(bmp)에 불러들인후
image2를 저장하는 방법을 써봤는데..
image2는 size를 고정시켰습니다 예를들면 height:200, width:200
그런데 image1(원본)의 선택한 부분이 image2보다 더 큰경우
그림이 이상하게 저장되네요.. 다시 불러봐도 제대로 안되구요..
-원본의 선택한 부분의 size가 image2(destination) size보다 크거나 작더라도
고정된 size로 복사하는 방법좀 알려주세요
-아님 위와 같은 작업을 할려고 할경우 좀 더 좋은 방법이 있으면 알려주세요..
image1, image2는 모두 사용자에게 보여줘야 되구요..
> [질문]bmp나 jpg 파일 일부분만만 잘라내서 저장하기
>
> 고수님들의 도움을 부탁드립니다.
>
> bmp파일을 image1에 불러들인후
> mouse로 일부분만을 선택한후에 선택된 부분만
> 다시 파일로 저장할려구 하거든요.
>
> 그래서 우선 image1에 bmp 파일을 불러들인후
> mouse로 사각형을 그리고 그린부분만큼을
> canvas.copyrect를 써서 image2(bmp)에 불러들인후
> image2를 저장하는 방법을 써봤는데..
> image2는 size를 고정시켰습니다 예를들면 height:200, width:200
>
> 그런데 image1(원본)의 선택한 부분이 image2보다 더 큰경우
> 그림이 이상하게 저장되네요.. 다시 불러봐도 제대로 안되구요..
>
> -원본의 선택한 부분의 size가 image2(destination) size보다 크거나 작더라도
> 고정된 size로 복사하는 방법좀 알려주세요
> -아님 위와 같은 작업을 할려고 할경우 좀 더 좋은 방법이 있으면 알려주세요..
> image1, image2는 모두 사용자에게 보여줘야 되구요..
>
이미지를 줄이기 위해서 TCanvas.StretchDraw를 사용하면 원본 이미지로부터 몇몇 픽셀들을 제거하게 됩니다. 이 방법의 문제점은 제거된 픽셀에 있던 정보들은 완전히 잃어버리게 된다는 것입니다. 만약 거기에 중요한 정보(수직선이 있는 픽셀들과 같이)가 있었다면 결과물에서는 보이지 않게 될 것입니다.
더 좋은 방법은 축소된 출력 이미지안에 들어갈 픽셀을 만들기 위해 근처의 픽셀들을 가지고 평균을 내는 것입니다. 이렇게 해서 출력 이미지의 각 픽셀에 대해 작업하는 것입니다. 각각의 출력 픽셀에 대하여, 프로그램이 출력 픽셀로 매핑될 입력 이미지의 픽셀들을 계산하는 것입니다. 그리고 나선, 이 입력 픽셀들의 Red, Green, Blue 값들에 대해 평균을 만들어 내는 것입니다.
여기에서 가장 중요한 코드는 입력 픽셀들로부터 출력 픽셀로의 값을 결정해서 매핑시키는 함수입니다. 이미지가 x와 y 방향으로 각각 xscale, yscale 만큼이 비율로 줄어든다면, 출력 픽셀 (to_x, to_y)는 아래와 같은 식에 따라 사각형 x1 <= x <= x2, y1 <= y <= y2 로 매핑됩니다.
y1 = Trunc((to_y - to_y1) / yscale + from_y1)
y2 = Trunc((to_y + 1 - to_y1) / yscale + from_y1) - 1
x1 = Trunc((to_x - to_x1) / xscale + from_x1)
x2 = Trunc((to_x + 1 - to_x1) / xscale + from_x1) - 1
프로시져가 입력 이미지의 사각형 부분을 찾아 낸후, 이 픽셀들의 Reg, Gree, Blue 색깔의 각각에 대해 평균을 찾아낸 후 출력 픽셀 (to_x, to_y)에 그 값을 지정하는 것입니다.
이렇게 하면, 적어도 정보의 손실은 막을 수 있어서 축소된 이미지를 보면 어느정도 부드럽게 축소가 되었다는 것을 알 수 가 있습니다.