PHP에서 GD 라이브러리를 사용하여 비트 맵 파일을 JPEG로 변환하는 방법을 알아 내려고 노력했습니다.PHP에서 GD 라이브러리를 사용하여 비트 맵 파일을 JPEG로 변환
많은 구현을 시도했지만 아무 것도 작동하지 않는 것 같습니다. 내 고객에게 비트 맵 파일을 사용하지 않아야한다고 말했지만 실제로 솔직하게 JPG로 변환 할 수있는 컴퓨터에 대해서는 충분히 이해하지 못했습니다.
이 서버에서 ImageMagick을 사용할 수 없으며 순수한 GD 솔루션이 필요합니다. 모든 도움을 위해 미리 감사드립니다.
EDIT : 사용되는 비트 맵 이미지가 16 비트이며, 문제가 발생하는 위치 즉
.
나는 좀 .... 내가 작업 한이 기능을 가지고 : 당신이 왼쪽에있는 이미지를 보면
:
이function ImageCreateFromBMP($filename) {
if (! $f1 = fopen($filename,"rb")) return FALSE;
$FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));
if ($FILE['file_type'] != 19778) return FALSE;
$BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
'/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
'/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));
$BMP['colors'] = pow(2,$BMP['bits_per_pixel']);
if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
$BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
$BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
$BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
$BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);
$BMP['decal'] = 4-(4*$BMP['decal']);
if ($BMP['decal'] == 4) $BMP['decal'] = 0;
$PALETTE = array();
if ($BMP['colors'] < 16777216 && $BMP['colors'] != 65536) {
$PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));
}
$IMG = fread($f1,$BMP['size_bitmap']);
$VIDE = chr(0);
$res = imagecreatetruecolor($BMP['width'],$BMP['height']);
$P = 0;
$Y = $BMP['height']-1;
while ($Y >= 0) {
$X=0;
while ($X < $BMP['width']) {
if ($BMP['bits_per_pixel'] == 24)
$COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
elseif ($BMP['bits_per_pixel'] == 16) {
$COLOR = unpack("v",substr($IMG,$P,2));
$blue = ($COLOR[1] & 0x001f) << 3;
$green = ($COLOR[1] & 0x07e0) >> 3;
$red = ($COLOR[1] & 0xf800) >> 8;
$COLOR[1] = $red * 65536 + $green * 256 + $blue;
}
elseif ($BMP['bits_per_pixel'] == 8) {
$COLOR = unpack("n",$VIDE.substr($IMG,$P,1));
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
elseif ($BMP['bits_per_pixel'] == 4) {
$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
elseif ($BMP['bits_per_pixel'] == 1) {
$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
if (($P*8)%8 == 0) $COLOR[1] = $COLOR[1] >>7;
elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;
elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;
elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;
elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;
elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;
elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;
elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
else
return FALSE;
imagesetpixel($res,$X,$Y,$COLOR[1]);
$X++;
$P += $BMP['bytes_per_pixel'];
}
$Y--;
$P+=$BMP['decal'];
}
fclose($f1);
return $res;
}
결과 이미지가 이것이다 결과 이미지가 올바르게 정렬되어 있지 않은 것을 볼 수 있습니다. 작은 조각은 오른쪽에 있습니다. 코드가 어디에서 잘못 되었습니까? 문제는 16 비트 else-if에서 발생합니다.
모든 도움을 주셔서 다시 한 번 감사드립니다.
코드를 확인했는데 문제가없는 것 같습니다. BMP 형식이 예상대로 (54 바이트, 팔레트 데이터 없음, 다음 이미지 데이터)입니까? 이것이 약간의 이국적인 BMP 변종이므로 헤더에이 "이동"오류를 유발하는 추가/더 적은 데이터가있을 수 있습니다. – schnaader
솔직히 말해서 나는 이미지에서 어떤 일이 벌어지고 있는지 정말로 모른다. 사진 중 하나를 이메일로 보낼 수있는 방법이 있다면 사진을보실 수 있습니다 ... 지금 나는이 이미지 파일에 대해 지금보다 더 관심이 있습니다. 내가 연락 할 수있는 이메일은 gmail.com의 dphoebus이며 이미지 중 하나를 회신 해 드리겠습니다. –