Добрый день. Есть, например BITMAPINFOHEADER * pBIH; Есть указатель и массив байтов картинки (bmp) pBytes *pBt; Не могу разобраться, помогите советом. Мне надо изменить размер картинки, например уменьшить в 2 раза. По логике, такая операция сводится к копированию массива байтов из *pBt в новый массив, например в *pBt2, с определенным алгоритмом уменьшения кол-ва пикселей. Все что я нашел в MSDN это StretchBlt. В этой ф-ции надо получать HDC. Зачем мне получать HDC, если я не буду отображать картинку на экран, мне надо изменить размеры картинки и записать ее в файл. Как это сделать?
Aids 1) Создаешь файл и открываешь его 2) Создаешь заголовок BMP, читаешь системную палитру и на ее основе создаешь палитру BMP 3) читаешь из памяти и пишешь в файл через пиксель. В файле образ "перевернут", то есть придется писать в файл от конца к началу. Строки в BMP выравниваются до кратности 4 4) закрываешь файл
Так пиксели будут теряться. Лучше брать среднее арифметическое 4 пикселей. Для 32 битного изображения примерно так: Код (Text): mov dx,height/2 col: ;esi - исходный растр ;edi - результат mov ecx,width/2 row:punpcklbw mm0,[esi] psrlw mm0,8 punpcklbw mm1,[esi+4] psrlw mm1,8 punpcklbw mm2,[esi+width*4] psrlw mm2,8 punpcklbw mm3,[esi+width*4+4] psrlw mm3,8 paddw mm0,mm1 paddw mm0,mm2 paddw mm0,mm3 psrlw mm0,2 packuswb mm0,mm0 movd [edi],mm0 add esi,8 add edi,4 loop row add esi,width*4 dec dx jne col Код не проверял - возможно не работает
Aids Мне нужно хранить мясо в холоде. Зачем мне покупать холодильник, если я не буду хранить в нём молоко? Ответ в том, что мясо тем не менее нужно где-то хранить. Мораль: создавайте контекст устройства, а не мучайте себя вопросами бытия. Создавайте не для того, чтобы вывести картинку на экран, а для того, чтобы её уменьшить.
А я таким макаром делал. invoke CopyImage,[hBmp],IMAGE_BITMAP,[Width],[Height],LR_CREATEDIBSECTION ------------------------------------------------------------------- The CopyImage function creates a new image (icon, cursor, or bitmap) and copies the attributes of the specified image to the new one. If necessary, the function stretches the bits to fit the desired size of the new image. HANDLE CopyImage( HANDLE hImage, // handle to the image to copy UINT uType, // type of image to copy int cxDesired, // desired width of new image int cyDesired, // desired height of new image UINT fuFlags // copy flags );
l_inc Сделал следующее: Код (Text): if pGrabber=nil then exit; pGrabber.GetCurrentBuffer(cbBuffer, nil); pBuffer:=pointer(GlobalAlloc(0,cbBuffer)); hr:=pGrabber.GetCurrentBuffer(cbBuffer,pBuffer); pGrabber.GetConnectedMediaType(mt); pVih := mt.pbFormat; hHeader.bmiHeader:=pVih^.bmiHeader; hDispley:=GetDC(0); hCopy:=CreateCompatibleDC(hDispley); hBmp:=CreateCompatibleBitmap(hDispley,pVih^.bmiHeader.biWidth,pVih^.bmiHeader.biHeight); SelectObject(hCopy,hBmp); SetDIBitsToDevice(hCopy, 0, 0,pVih^.bmiHeader.biWidth, pVih^.bmiHeader.biHeight,0, 0, 0,pVih^.bmiHeader.biHeight,pBuffer,hHeader,DIB_RGB_COLORS); stretchBlt(form1.Image1.Canvas.Handle,0,0,form1.Image1.Width,form1.Image1.Height,hCopy, 0,0,pVih^.bmiHeader.biWidth,pVih^.bmiHeader.biHeight,SRCCOPY); DeleteDC(hDispley); DeleteDC(hCopy); DeleteObject(hBmp); GlobalFree(dword(pBuffer)); Form1.Image1.Refresh; всё работает, но появилась проблема. У уменьшеной картинки сильно упало качество. Может что-то ещё посоветуете?