2012-08-24 2 views
11

Nihilogic의 canvas2image JavaScript 라이브러리를 사용하여 HTML 캔버스를 이미지로 변환하는 작은 test web app을 결합한 다음 캔버스를 생성 된 이미지로 대체하고 사용자가 휴대 전화에 저장하려면 이미지를 길게 터치하십시오.이미지를 Android 브라우저에서 데이터 스트림으로 렌더링

안드로이드의 기본 웹 브라우저 ("인터넷")는 이미지를 나타내는 base64로 인코딩 된 데이터 스트림을 렌더링하지 않지만 대신 물음표 기호를 표시합니다. 이 문제를 해결할 방법이 있습니까? 그렇다면 어떻게?

+0

이 발생한다? Jelly Bean (4.1.1)에서 작동합니다. 캔버스에서 이미지를 생성 할 수 있으며 문제없이 저장할 수 있습니다. – alex

+0

src와 함께 img를 만드는 대신 CSS 스타일'background-image : url (data : image/png; base64datahere ....);가있는 div를 만들면 어떻게 될까요? – Prasanth

답변

4

사용자 정의 ContentProvider를 사용하고 openFile()을 재정 의하여 스트림을 Tempfile로 반환하십시오.

URI를 HTML A 태그의 src로 사용할 수 있습니다. @goldenparrot 화상의 주석에 기초

<a src="Example://file"></a> 
public class ExampleProvider extends ContentProvider { 

    @Override 
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {   
     //Get your bitmap 
     Bitmap bmp = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.file_example); 
     File tempFile = null; 
     try { 
      //Create the tempfile form a stream 
      tempFile = File.createTempFile("tempfile", ".thumb", getContext().getCacheDir()); 
      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(tempFile)); 
      bmp.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      out.close(); 
      if(mode.equals("r")) { 
       return ParcelFileDescriptor.open(tempFile, ParcelFileDescriptor.MODE_READ_ONLY); 
      } 
     } 
     catch(IOException e) { 
      LOGGER.error("Couldn't generate temp file for thumb view, guid:" + guid, e); 
     } 
     finally { 
      if(tempFile != null { 
       //The unix filesystem automatically deletes the file once all handles are gone 
       tempFile.delete(); 
      } 
     } 
    } 
} 
+0

아주 좋은 해결책입니다. 이러한 종류의 솔루션은 항상 프로젝트 팀에 완전한 제어 개발 모델을 제공하므로 예외를 처리하여 예외를 수정하고 예외를 처리 할 필요가없는 경우 기본 방법을 유지할 수 있습니다. 하지만 이것은 역방향 호환성이 중요한 경우에만 좋은 접근 방법으로 생각됩니다. – Miere

+0

@Ty S. 정확히 어떤 언어입니까? 나는 말할 수 없다. –

+0

Android 플랫폼의 Java – tsmith

1

<img src="data:image/png;base64,BASE64_STRING_HERE" /> 

(및 제안 된 CSS 배경 이미지로) 64 기수 데이터가 이미 존재하는 페이지가 로딩 될 때

으로 볼 수있다 . 그러나 정확하게 동일한 데이터 문자열이 동적으로 입력되는 경우 어떤 이유로 작동하지 않습니다. base64 데이터로 정적으로로드 된 이미지조차도 문제가 있습니다. 어떤 식 으로든 긴 클릭에 반응하지 않으므로 다운로드 할 수 없습니다. Android 2.3.6을 사용하고 있습니다.

편집 : 당신은 또한 추가로 다운로드 링크를

<a href="data:application/octet-stream;base64,BASE64_STRING_HERE">download file</a> 

를 추가하려고 할 수 있지만 나를 위해 작동하지 않았다. Android는 해당 파일의 내용을 텍스트로 표시했습니다. 일반 데스크톱 웹 브라우저는 "파일 다운로드"대화 상자를 열었지만 해당 파일의 확장명을 제안하지 않았으므로 수동으로 추가해야합니다.

Browser/HTML Force download of image from src="data:image/jpeg;base64..."

내 테스트 HTML 페이지가 실행중인 안드로이드 버전은 무엇 http://kuitsi.bitbucket.org/stackoverflow12113616.html

관련 문제