Изменение разрешения BMP
Помогите плиз!!!
Мне надо программно изменить разрешение BMP файла. Возможно ли такое???
ПоМогИтЕ (на любом языке, кроме Delphi!!!).
[COLOR=red]Народ!!![/COLOR]
Помогите плиз!!!
Мне надо программно изменить разрешение BMP файла. Возможно ли такое???
ПоМогИтЕ (на любом языке, кроме Delphi!!!).
Разрешение - это как? dpi?
Разрешение - это как? dpi?
Не совсем dpi. Точнее совсем не dpi.
Приведу пример: у меня есть битмап-файл 640х480, а мне надо его отресайзить до 300х200. Вот про это я и спрашиваю!
[FONT=times new roman][SIZE=4]Да, и еще! Если нельзя отресайзить Битмап, то хотя бы как узнать его разрешение???[/SIZE][/FONT]
Не совсем dpi. Точнее совсем не dpi.
Приведу пример: у меня есть битмап-файл 640х480, а мне надо его отресайзить до 300х200. Вот про это я и спрашиваю!
[FONT=times new roman][SIZE=4]Да, и еще! Если нельзя отресайзить Битмап, то хотя бы как узнать его разрешение???[/SIZE][/FONT]
пусть у тебя есть HBITMAP bitmap
в него загружен ВМР
SIZE size;
GetBitmapDimensionEx(bitmap,&size);
x=size.cx;
y=size.cy;
а ресайзить уже сложнее...
Но у меня есть еще вопрос!
Как узнать bpp битмапа или, в частности, как пользоваться функцией GetBitmapBits?
--
Да, кстати, есть же функция SetBitmapDimension. Нельзя ли ей воспользоваться для ресайза?
пусть у тебя есть HBITMAP bitmap
в него загружен ВМР
SIZE size;
GetBitmapDimensionEx(bitmap,&size);
x=size.cx;
y=size.cy;
а ресайзить уже сложнее...
Не получается... В size.cx & .cy после выполнения лежат пустые значения!
HANDLE hFile;
TCHAR FileName[] = TEXT("%Имя файла%");
BITMAPFILEHEADER *fh;
unsigned char *bits;
int Size, Read;
hFile = CreateFile (FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile == INVALID_HANDLE_VALUE) return;
Size = GetFileSize(hFile, NULL);
bits = (unsigned char *) malloc(Size);
if (!bits)
{
CloseHandle(hFile);
return;
}
ReadFile (hFile, bits, Size, (unsigned long *) &Read, NULL) ;
if(Read != Size
{
CloseHandle(hFile);
return;
}
fh = (BITMAPFILEHEADER *) (bits);
int Offset = (int) fh->bfOffBits);
int Width = (int) ((BITMAPINFOHEADER *) (bits + sizeof(BITMAPFILEHEADER)))->biWidth);
int Height = (int) ((BITMAPINFOHEADER *) (bits + sizeof(BITMAPFILEHEADER)))->biHeight);
CloseHandle(hFile);
Немного сложновато, но имеем правильные данные о размере, смещение в памяти данных битмэпа и возможность их изменить и записать.
Не получается... В size.cx & .cy после выполнения лежат пустые значения!
The GetBitmapDimensionEx function retrieves the dimensions of a compatible bitmap. The retrieved dimensions must have been set by the SetBitmapDimensionEx function.
То бишь перед тем как использовать GetBitmapDimensionEx нужно задать размерность функцией SetBitmapDimensionEx. Зачем нужны эти функции ума не приложу. Может что-то вроде userdata? В MSDN прямо написано, что значения заданные SetBitmapDimensionEx системой не используются
[SIZE=3]Спасибо всем, кто помог![/SIZE]
Но у меня есть еще вопрос!
Как узнать bpp битмапа или, в частности, как пользоваться функцией GetBitmapBits?
--
Да, кстати, есть же функция SetBitmapDimension. Нельзя ли ей воспользоваться для ресайза?
GetBitmapBits пользоваться не надо - эта функция оставлена для совместимости с Win16. Новая функция называется GetDIBits
int GetDIBits(
HDC hdc, // handle to DC
HBITMAP hbmp, // handle to bitmap
UINT uStartScan, // first scan line to set
UINT cScanLines, // number of scan lines to copy
LPVOID lpvBits, // array for bitmap bits
LPBITMAPINFO lpbi, // bitmap data buffer
UINT uUsage // RGB or palette index
);
для более полного описания см. MSDN
При использовании этой функции следует быть осторожным со сжатыми изображениями (RLE). Хотя судя по описанию функция с ними работает, но у меня (WinXP) она то работала, то нет - закономерности не замечено.
Еще немного инфы по топику
http://forum.codenet.ru/showthread.php?s=&postid=39667#post39667
Насчет SetBitmapDimension см. выше
[COLOR=red]Народ!!![/COLOR]
Помогите плиз!!!
Мне надо программно изменить разрешение BMP файла. Возможно ли такое???
ПоМогИтЕ (на любом языке, кроме Delphi!!!).
А мне как раз нужно тоже самое, только на Delphi!
Подскажите, пожалуйста.
А мне как раз нужно тоже самое, только на Delphi!
Сначала объясни, что в твоем понимании означает "сменить разрешение".