자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey 모바일에서 이미지 로딩시, 사진 방향이 바뀌는 이유
2021.01.26 18:26
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
TakePhotoFromLibrary 로 포토앨범에서 사진을 불러오면
노트9은 사진의 방향이 좌/우/플립 으로 바뀝니다
원인이 무엇일까요?
왜 사진이 방향이 정방향이 아니고, 90도 틀어진 방향으로 나올까요? ㅠㅠ
댓글 3
-
delphiman
2021.01.26 19:11
-
delphiman
2021.01.29 10:16
위 정보는 안됩니다.
TakePhotoFromLibraryAction1 의 프로퍼티의 Editable = True로 하면 됩니다.
TakePhotoFromLibraryAction1DidFinishTaking(Image: TBitmap);
여기자체에어 리턴되는 Image가 원본이 아니고, 가공된(사이즈가 줄여진) 비트맵이 넘어오기 때문에
exif 정보를 읽을 수가 없습니다.. (델파이에서 왜 이렇게 했는지는 이해가 안됩니다.)
원본을 넘겨야지, 자체적으로 사이즈를 줄여서 (그것도 너무 줄여서 화질도 좀 낮아집니다)
MaxHeight Width 를 아무리 많이 줘도, 원본사이즈 이미지가 넘어오지 않습니다.
아무튼 Editable = True로 하면, 이미지 선택후, 이미지 편집하는 화면으로 넘어가는데 거기서 확인을 누르면
자동으로 정확한 이미지가 리턴됩니다. (이것도 원본은 아닙니다)
원본으로 하실려면, 웹브라우저 컴포를 이용하시고, PHP나 자바스크립트등을 이용해서 HTML5로 이미지를 열어
그곳에서 처리하고, 델파이에서 받으면 됩니다.
-
delphiman
2021.01.29 14:55
참고로 이미지를 Base64String으로 받아서, 비트맵에 exif 정보가 있다면, 그만큼 이미지를 회전시켜 다시 이미지로 저장하여
base64스트링으로 리턴해주는 PHP 함수를 공유해드립니다.
해당 PHP 의 내부 부분만 참고하시면 됩니다.
델파이 자체에서 해결할 수 없다면, 다른 언어(웹이든 프로그램이든) 의 힘을 빌려, 프로젝트를 이어가는 것도
일정부분 필요한거 같습니다.
//===========================================================================
// ● 이미지 방향 조정후 base64string 리턴
//===========================================================================
$app->post('/'.$device.'/global/SetImageRotationCorrection' , function(Request $request , Response $response){
global $DBName;
$as_img_base64 = $request->getParam('as_img_base64');
try{
$tmpfname = './tmp_'.date("Ymd_His", time()).'_'.mt_rand(100, 100000).'.jpg';
//base64스트링 $tmpfname 파일로저장
$base64 = base64_decode($as_img_base64);
$myfile = fopen($tmpfname, "w");
fwrite($myfile, $base64);
fclose($myfile);
//이미지를 회전해야하는지 판단 exif
@$image = imagecreatefromjpeg($tmpfname);
$Orientation = '-1';
$exif = exif_read_data($tmpfname);
if(!empty($exif['Orientation']))
{
//echo $exif['Orientation']; exit;
switch($exif['Orientation']) {
case 8:
$Orientation = 8;
$image = imagerotate($image,90,0);
break;
case 3:
$Orientation = 3;
$image = imagerotate($image,180,0);
break;
case 6:
$Orientation = 6;
$image = imagerotate($image,-90,0);
break;
}
}
//이미지 다시 저장
imagejpeg($image, $tmpfname, 93);
imagedestroy($image);
//저장된 이미지 base64스트링 만들기
$imagedata = file_get_contents($tmpfname);
$base64 = base64_encode($imagedata);
$r_json = "";
$r_json = $r_json.'{';
$r_json = $r_json.'"Result": {"ResultCode": 0, "ResultMsg": "'.$base64.'"}';
$r_json = $r_json.'}';
echo $r_json;
//파일삭제
unlink($tmpfname);
}catch(Exception $e){
echo '{"Result": {"ResultCode": -10,"ResultMsg":'.'"'.$e->getMessage().'"'.'}}';
}
});
Firemonkey 모바일에서 이미지 로딩시, 사진 방향이 바뀌는 이유
2021.01.26 18:26
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
TakePhotoFromLibrary 로 포토앨범에서 사진을 불러오면
노트9은 사진의 방향이 좌/우/플립 으로 바뀝니다
원인이 무엇일까요?
왜 사진이 방향이 정방향이 아니고, 90도 틀어진 방향으로 나올까요? ㅠㅠ
댓글 3
-
delphiman
2021.01.26 19:11
-
delphiman
2021.01.29 10:16
위 정보는 안됩니다.
TakePhotoFromLibraryAction1 의 프로퍼티의 Editable = True로 하면 됩니다.
TakePhotoFromLibraryAction1DidFinishTaking(Image: TBitmap);
여기자체에어 리턴되는 Image가 원본이 아니고, 가공된(사이즈가 줄여진) 비트맵이 넘어오기 때문에
exif 정보를 읽을 수가 없습니다.. (델파이에서 왜 이렇게 했는지는 이해가 안됩니다.)
원본을 넘겨야지, 자체적으로 사이즈를 줄여서 (그것도 너무 줄여서 화질도 좀 낮아집니다)
MaxHeight Width 를 아무리 많이 줘도, 원본사이즈 이미지가 넘어오지 않습니다.
아무튼 Editable = True로 하면, 이미지 선택후, 이미지 편집하는 화면으로 넘어가는데 거기서 확인을 누르면
자동으로 정확한 이미지가 리턴됩니다. (이것도 원본은 아닙니다)
원본으로 하실려면, 웹브라우저 컴포를 이용하시고, PHP나 자바스크립트등을 이용해서 HTML5로 이미지를 열어
그곳에서 처리하고, 델파이에서 받으면 됩니다.
-
delphiman
2021.01.29 14:55
참고로 이미지를 Base64String으로 받아서, 비트맵에 exif 정보가 있다면, 그만큼 이미지를 회전시켜 다시 이미지로 저장하여
base64스트링으로 리턴해주는 PHP 함수를 공유해드립니다.
해당 PHP 의 내부 부분만 참고하시면 됩니다.
델파이 자체에서 해결할 수 없다면, 다른 언어(웹이든 프로그램이든) 의 힘을 빌려, 프로젝트를 이어가는 것도
일정부분 필요한거 같습니다.
//===========================================================================
// ● 이미지 방향 조정후 base64string 리턴
//===========================================================================
$app->post('/'.$device.'/global/SetImageRotationCorrection' , function(Request $request , Response $response){
global $DBName;
$as_img_base64 = $request->getParam('as_img_base64');
try{
$tmpfname = './tmp_'.date("Ymd_His", time()).'_'.mt_rand(100, 100000).'.jpg';
//base64스트링 $tmpfname 파일로저장
$base64 = base64_decode($as_img_base64);
$myfile = fopen($tmpfname, "w");
fwrite($myfile, $base64);
fclose($myfile);
//이미지를 회전해야하는지 판단 exif
@$image = imagecreatefromjpeg($tmpfname);
$Orientation = '-1';
$exif = exif_read_data($tmpfname);
if(!empty($exif['Orientation']))
{
//echo $exif['Orientation']; exit;
switch($exif['Orientation']) {
case 8:
$Orientation = 8;
$image = imagerotate($image,90,0);
break;
case 3:
$Orientation = 3;
$image = imagerotate($image,180,0);
break;
case 6:
$Orientation = 6;
$image = imagerotate($image,-90,0);
break;
}
}
//이미지 다시 저장
imagejpeg($image, $tmpfname, 93);
imagedestroy($image);
//저장된 이미지 base64스트링 만들기
$imagedata = file_get_contents($tmpfname);
$base64 = base64_encode($imagedata);
$r_json = "";
$r_json = $r_json.'{';
$r_json = $r_json.'"Result": {"ResultCode": 0, "ResultMsg": "'.$base64.'"}';
$r_json = $r_json.'}';
echo $r_json;
//파일삭제
unlink($tmpfname);
}catch(Exception $e){
echo '{"Result": {"ResultCode": -10,"ResultMsg":'.'"'.$e->getMessage().'"'.'}}';
}
});
자답 : 비트맵 메타데이터 exif 정보를 읽어 회전된경우 그에 맞게 회전해주면 됩니다.
https://youtu.be/T9bADuBRvL4