What Should I do?
JS - 브라우저에서 이미지 포맷 변환하기
Canvas의 toBlob() 함수 Canvas Element에는 toBlob() 함수가 있다. 이 함수를 이용하면 jpeg, png, webp로 데이터를 받아올 수 있다. 굳이 서버에서 이미지를 변환할 필요가 없다. 이미지 포맷을 변환하는 프로그램을 간단히 만들 수 있으며, 서버로 보내기전에 webp로 바꾸어 전송하면 트래픽 사용량과 저장공간도 아낄 수 있다. 이 글에서는 이 변환하는 방법을 설명한다. 어떻게 동작하나? 이미지를 로드하고 canvas를 만들어 이미지를 그린다. 그리고 canvas의 toBlob을 이용해 이미지 포맷을 변경하는 것이다. 다음은 화면에 보이든, 서버로 보내든, 다운로드하든 필요한 작업을 하면 된다. 간단히 의미별로
<img> 태그의 decoding 속성 – 'load'이벤트가 끝이 아니었다.
load는 디코딩을 포함하지 않는다. 이미지를 서버에서 다운로드 받아오면 ‘load’이벤트가 발생한다. 이 것을 이용해서 이미지가 로드되었음을 확인할 수 있는 데, 이미지는 주로 압축이 되어있기 때문에 decoding을 거쳐 pixel단위의 데이터로 변경되어야 화면에 그릴 수 있다. 이 디코딩은 언제 실행되는 지가 궁금했는 데, decoding의 속성에 따라서 실제 decoding의 실행시점이 달라지게 된다. Decoding은 필요한 경우에만 실행된다. 실제 화면에 그리는 작업을 하지 않으면 decoding이 필요가 없기 때문에 브라우저는 이미지를 다운로드 받았다고 decoding을 하지 않는다. load이벤트가 발생했다고 즉시 화면에 그릴 수 있다는 뜻이 아니라는 것이다. 실제 decoding 일어
안드로스튜디오에서 외부 JAVA소스 폴더 링크하는 법
android { .... .... sourceSets { main.java.srcDirs += 'src/main/<YOUR DIRECTORY>' } } build.gradle 파일의 android 부분에내용을 추가 한다. 여러개를 넣을경우 sourceSets { main { java.srcDirs = [ '/src/man<YOUR Directory>', 'c:/myjavapack/classes' ] } } build.gradle file의위치는 app 밑에 있는 것이다.(최상위가 아니다.) 이렇게 하고 sync하면 자동으로 프로젝트에 추가 된다.
간단한 TGA파일 구조
가장 간단한 이미지 포맷이 필요한 상황이 발생했다. BMP포맷이 있지만, 어쩌다 TGA라는 포맷이 꽂혀서 좀 찾아 보기로 했다. 구조와 순서 TGA 구조와 순서 영역 크기 설명 1. Tga Header 18바이트 이미지의 주된 정보 2. Image ID 가변 Header의 첫 바이트[idLength]에 이 크기를 지정한다. 주로 사용하지 않는다. 3. ColorMap Data 가변 Palette 이미지를 사용할 경우만 존재하며, Palette Color값이 저장된다. 4. Pixel Data 가변 이미지 픽셀 정보를 담는다. 헤더의 정보에 따라 RLE압축으로 데이터를 넣
Exif 썸네일 추출 C코드
Jpeg 파일에서 썸네일을 추출해보기로 했다. 일단 기본이 되는 함수를 만들어 보자. // You must call exif_data_unref(return value ) if return value is not null. ExifData* JpegExif_GetThumbnail( const char* pszJpegFilePathName ) { ExifData* ret = nullptr; ExifLoader *loader = exif_loader_new(); ExifData *ed = nullptr; if( !loader ) { return nullptr; } exif_loader_write_file( loader, pszJpegFilePathName ); ed = exif_loader_get_data(lo
VC 디스크 드라이브 목록 구하기
단순 드라이브 목록 단순히 드라이브목록만 구하려면 다음과 같이 할 수 있다. 방법1 - GetLogicalDrives List1 - 루트목록1 void DiplayDrives1() { DWORD drives = GetLogicalDrives(); for (int i = 0; i < 26; i++) { if ( drives & ( 1 << i ) ) { wprintf(L"%c\n", L'A' + i ); } } } bit의 위치가 SET되으면 그 드라이브가 존재한다는 뜻이다. 만약 5번째 비트가 SET되어 있다면, ABCD(E)F.. 중 E드라이브가 있다는 뜻이 된다. 대부분의 상황에서 이 방법은 잘 작동한다. 사용법은 단순하지만, 이 방법은 26번의 루프를 돌아야 될 뿐만
VC 드라이브 볼륨 시리얼번호등 정보 알아내기
디스크와 볼륨은 다른 것이다. volume의 시리얼번호만으로 대부분의 상황에 대응이 가능하니 이 글에서는 Disk의 시리얼번호가 아니고 볼륨의 시리얼번호를 다룬다. 함수명은 GetVolumeInformation으로 드라이브이름, 파일시스템형태, 기본정보를 알아낼수 있습니다. VC에서 GetVolumeInformationW까지 치고 [F1]누르면 MS의 함수명세를 볼 수 있다. GetVolumeInformation BOOL GetVolumeInformationW( [in, optional] LPCWSTR lpRootPathName, [out, optional] LPWSTR lpVolumeNameBuffer, [in] DWORD nVolumeNameSize, [out, optional] LPDWORD lpVol