/* Функция: CFSaveToDIB Цель: Сохраняет изображение в формате DIB Параметры: [ in ] hImage - дескриптор изображения [ out ] info - указатель на заголовок DIB [ out ] DIBPixels - указатель на пиксели изображения Возвращаемые заначения: CF_SUCCESS - данные изображения успешно записаны в память. в противном случае возвращает код ошибки. Замечания: Функция всегда записывает любое изображение hImage в формате DIB, который имеет глубину цвета 3 байта */ CF_ERROR __EXPORT_TYPE CFSaveToDIB( CF_IMAGE hImage, CF_BMP* info, BYTE* DIBPixels ) { CF_ERROR status = CF_SUCCESS; if(info == NULL) { status = CFF_INVALID_DIB; return status; } TLFImage* image = (TLFImage*)hImage; if(image == NULL) { status = CFF_INVALID_HANDLE; return status; } BITMAPINFO lInfo; memcpy( &lInfo, info, sizeof( BITMAPINFO ) ); bool flag = DIBPixels == NULL? false : true; if(awpImageToDIB( image->GetImage(), &lInfo, (void**)(&DIBPixels), flag )!=AWP_OK) { status = CFF_INVALID_DIB; return status; } memcpy( info, &lInfo, sizeof( BITMAPINFO ) ); return status; }
//--------------------------------------------------------------------------- void __fastcall TDIBImage::LoadFromFile(const AnsiString Filename) { awpImage *image = NULL; if ( awpLoadImage(Filename.c_str(), &image) != AWP_OK ) return; unsigned char *pDIB = (unsigned char *)::GlobalLock( (HGLOBAL)m_DIBPixels ); awpImageToDIB( image, &m_DIBInfo, &(void *)pDIB, true ); awpReleaseImage(&image); ::GlobalUnlock( (HGLOBAL)m_DIBPixels ); }
//--------------------------------------------------------------------------- void __fastcall TDIBImage::SetAWPImage( const awpImage* pImage ) { if ( pImage == NULL ) return; // Convert awpImage data to DIB format unsigned char *pPixels = NULL; BITMAPINFO bInfo; if ( awpImageToDIB( pImage, &bInfo, &((void*)pPixels), false ) != AWP_OK ) return; Clear(); // Allocate global memory for converted pixels long w = ((pImage->sSizeX * 24 + 31)/32) * 4; long size = w * pImage->sSizeY * sizeof(unsigned char); m_DIBPixels = (HDIB) ::GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, size ); if ( m_DIBPixels == 0 ) { Clear(); free( pPixels ); return; } // Copy converted pixels into global memory block unsigned char *pDIB = (unsigned char *) ::GlobalLock( (HGLOBAL)m_DIBPixels ); if ( pDIB == NULL ) { Clear(); free( pPixels ); return; } memcpy( pDIB, pPixels, size ); ::GlobalUnlock( (HGLOBAL)m_DIBPixels ); m_DIBInfo = bInfo; free( pPixels ); }
//--------------------------------------------------------------------------- void __fastcall TDIBImage::SetWidth( int in_Width ) { if (in_Width == m_DIBInfo.bmiHeader.biWidth) return; if ( in_Width <= 0 ) { Clear(); return; } if ( in_Width == Width ) return; awpImage *src_image = NULL; awpImage *dst_image = NULL; unsigned char *pDIB = NULL; long size = 0; long w = 0; if ( m_DIBPixels == 0 ) { if ( awpCreateImage( &dst_image, in_Width, 1, 3, AWP_BYTE ) != AWP_OK ) return; } else { pDIB = (unsigned char *) ::GlobalLock( (HGLOBAL)m_DIBPixels ); if (awpDIBToImage( &m_DIBInfo, pDIB, &src_image ) != AWP_OK ) return; ::GlobalUnlock( (HGLOBAL)m_DIBPixels ); if ( in_Width > src_image->sSizeX ) { awpColor white_color; white_color.bRed = 255; white_color.bGreen = 255; white_color.bBlue = 255; awpPoint pnt; pnt.X = 0; pnt.Y = 0; awpCreateImage( &dst_image, in_Width, src_image->sSizeY, src_image->bChannels, src_image->dwType ); //awpFill( dst_image, &white_color ); awpFill( dst_image, 255 ); awpPasteRect( src_image, dst_image, pnt ); } else { awpRect rect; rect.top = 0; rect.bottom = src_image->sSizeY - 1; rect.left = 0; rect.right = in_Width; awpCopyRect( src_image, &dst_image, &rect ); } } Clear(); w = ((dst_image->sSizeX * 24 + 31)/32) * 4; size = w * dst_image->sSizeY * sizeof(unsigned char); m_DIBPixels = (HDIB) ::GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, size ); if ( m_DIBPixels == 0 ) { awpReleaseImage( &src_image ); awpReleaseImage( &dst_image ); return; } pDIB = (unsigned char *) ::GlobalLock( (HGLOBAL)m_DIBPixels ); awpImageToDIB( dst_image, &m_DIBInfo, &((void*)pDIB), true); ::GlobalUnlock( (HGLOBAL)m_DIBPixels ); awpReleaseImage( &src_image ); awpReleaseImage( &dst_image ); }