TIFF, DIB section кто имел дело ?

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

TIFF, DIB section кто имел дело ?

Сообщение Lepsik »

я не сильно копенгаген в этом.
откомпилил библиотечку с http://www.tiff.org


файл зачитывается - теперь хочу этот массив на устройстве отобразить.
как мне получить DC для копирования. ?

вот кусок из кода :

Код: Выделить всё

     if (TIFFReadRGBAImage(tiff, w, h, raster, 0))
                 {
                    // 4)
                    // its tempting to copy straight to the DIB,
                    // however the DIB has an alignment
                    // restriction that is not applicable to
                    // tiff files...so they may have different
                    // widths

                    unsigned long * dest =
                         (unsigned long *)m_dib->GetBits();

                    unsigned long * src =
                         (unsigned long *)raster;

                    for (int row = 0; row < h; row++){

                       void * ptr_dest = dest + row * dibwidth;
                       void * ptr_src = src + row * w;
                       memcpy(ptr_dest,ptr_src,w*sizeof(int));
                    }

DIB секция имеет адрес в ptr_dest

теперь хочу довести до такой строки - DC_src хочу

HDC DC1 = GetDC(Image->Picture->Bitmap->Canvas->Handle);

BitBlt(DC1, 0, 0, w, h, DC_src, 0, 0, SRCCOPY);
DeleteDC(DC1);
Аватара пользователя
Смайл
Пользователь
Сообщения: 135
Зарегистрирован: 18 фев 2003, 10:38

Re: TIFF, DIB section кто имел дело ?

Сообщение Смайл »

Код: Выделить всё

void dib::render(HDC dc, const rect& dest, const rect& src) 
{
	if (!hbitmap) return;

  size sz = dimension();

	/* Determine whether to call StretchDIBits() or SetDIBitsToDevice() */
	int bSuccess;
	if ( dest.size() == src.size() )
  {
		bSuccess = ::SetDIBitsToDevice(dc,    // hDC
								   dest.left(),                // DestX
								   dest.top(),                 // DestY
								   dest.width(),               // nDestWidth
								   dest.height(),              // nDestHeight
								   src.left(),                 // SrcX
								   (int)sz.y - src.top() - src.height(), // SrcY - lower!
								   0,                          // nStartScan
								   (WORD)sz.y,             // nNumScans
								   data(),                     // _bits
								   &info,                      // _bitsInfo
								   DIB_RGB_COLORS);            // wUsage
   }
   else
   {
	  ::SetStretchBltMode(dc, COLORONCOLOR);
	  bSuccess = ::StretchDIBits(dc,        // hDC
								   dest.left(),                // DestX
								   dest.top(),                 // DestY
								   dest.width(),               // nDestWidth
								   dest.height(),              // nDestHeight
							     src.left(),                 // SrcX
							     src.top(),                  // SrcY
							     src.width(),                // wSrcWidth
							     src.height(),               // wSrcHeight
							     data(),                     // _bits
							     &info,                      // _bitsInfo
							     DIB_RGB_COLORS,             // wUsage
							     SRCCOPY);                   // dwROP
   }
   assert(bSuccess);
}
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Сообщение Lepsik »

спасибо - пхожо то что мне надо. 20 меговый файл в 800x600 превратить
Аватара пользователя
Смайл
Пользователь
Сообщения: 135
Зарегистрирован: 18 фев 2003, 10:38

Сообщение Смайл »

Lepsik писал(а):спасибо - пхожо то что мне надо. 20 меговый файл в 800x600 превратить
Обрати внимание что под W98 в один проход не получится.
Памяти у нея внутре мало.
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Сообщение Lepsik »

по другому я сделал GDI+ рулит 20 меговый тиф за 2 секунды конвертнул
Ответить