2012-10-15 6 views
1

나는 시스템에서 업로드 된 이미지를 회전하고 있습니다. 알고리즘은 다음과 같이 작동합니다.무손실 이미지 회전 PHP

1) User uploads a jpeg. It gets saved as a PNG 
2) Link to the temp png is returned to the user. 
3) The user can click 90left,90right, or type in N degrees to rotate 
4) The png is opened using 

    $image = imagecreatefrompng("./fileHERE"); 

5) The png is rotated using 

    $imageRotated = imagerotate($image,$degrees,0); 

6) The png is saved and the link returned to the user. 
7) If the user wishes to rotate more go back to step 3 operating on the newly 
    saved temporary PNG, 
    else the changes are commited and the final image is saved as a jpeg. 

왼쪽과 오른쪽으로 90도 회전 할 때 완벽하게 작동합니다. 사용자는 품질의 손실없이 무한대를 여러 번 돌릴 수 있습니다. 문제는 사용자가 20도 (또는 90의 다른 비 배수)를 회전하려고하는 경우입니다. 20도 회전 할 때 이미지가 약간 회전되고 채워야하는 영역을 채우기 위해 블랙 박스가 형성됩니다. 이미지 (블랙 박스 포함)가 png로 저장되기 때문에 다음 20도 회전은 이미지를 (블랙 박스와 함께) 또 다른 20도 회전시키고 느슨해 진 다른 블랙 박스를 형성합니다. 긴 이야기가 짧으면 360도까지 이렇게하면 매우 작은 나머지 이미지 주위에 큰 검은 색 상자가 생깁니다. 블랙 박스를 확대하고 자르더라도 품질이 현저히 떨어집니다.

어떤 방법 으로든 블랙 박스를 피할 수 있습니까? (서버에 imagick이 설치되어 있지 않습니다.)

+0

https://bugs.php.net/bug.php?id=25303 – hakre

+1

아니요, 없습니다. 이미지는 스퀘어 모서리를 가져야합니다. 스칼라 이미징이 작동하는 방식이기 때문에 무언가를 채워야합니다. 20도 회전하면 실제로 40도 회전을 원하지만 기본 이미지에서 다시 시작해야합니다. 그렇지 않으면 이미지가 필연적으로 후속 작업에서 부식됩니다. 말 그대로 당신이 이것에 관해 할 수있는 것은 없습니다. – DaveRandom

+0

@hakre -이 이유 때문에 JPEG가 아닌 PNG로 작동합니다. – user974896

답변

5

항상 소스 파일을 수정하지 않고 저장하고 회전 할 때 원본 소스 파일을 사용하여도를 회전하십시오. 따라서 20도 + 20 도는 소스를 40도 회전시키는 것을 의미합니다.

  1. 사용자가 JPEG를 업로드합니다.
  2. 사용자는 "90 left", "90 right"를 클릭하거나 N도를 입력하여 회전 할 수 있습니다. 사용자가 더 회전 3 단계로 돌아갑니다하고자하는 경우
  3. PNG는

    // If this is the first time, there is no rotation data, set it up 
    if(!isset($_SESSION["degrees"])) $_SESSION["degrees"] = 0; 
    
    // Apply the new rotation 
    $_SESSION["degrees"] += $degrees; 
    
    // Rotate the image 
    $rotated = imagerotate($image, $_SESSION["degrees"], 0); 
    
    // Save the image, DO NOT MODIFY THE SOURCE FILE! 
    imagejpeg($rotated, "./last.jpg"); 
    
    // Output the image 
    header("Content-Type: image/jpeg"); 
    imagejpeg($rotated); 
    
  4. ... PNG가 회전

    $image = imagecreatefromjpeg("./source.jpg"); 
    
  5. 를 사용하여 그렇지 않으면 last.jpg 열립니다 최종 값으로 취해 $_SESSION["degrees"] 매개 변수가 삭제됩니다.

+0

고마워요 (15 개) – user974896