// запись растрового изображения в неструктурированную память CF_ERROR __EXPORT_TYPE CFSaveToDump(CF_IMAGE hImage, CF_WORD* pWidth, CF_WORD* pHeight, CF_WORD* pBpp, CF_BYTE* buffer) { CF_ERROR status = CF_SUCCESS; // проверим входные параметры дескриптора изображения TLFImage* image = (TLFImage*)hImage; if(image == NULL) { status = CFF_INVALID_HANDLE; return status; } awpImage* pImage = NULL; pImage = image->GetImage(); if (awpCheckImage(pImage) != AWP_OK) { status = CFF_INVALID_HANDLE; return status; } // проверим возможность конвертации изображения //проверим остальные параметры if (pWidth == NULL || pHeight == NULL || pBpp == NULL || buffer == NULL) { return CFF_INVALID_PARAM; } // выполним копирование *pWidth = pImage->sSizeX; *pHeight= pImage->sSizeY; *pBpp = 8*pImage->bChannels; int bufsize = pImage->sSizeX*pImage->sSizeY*pImage->bChannels; CF_BYTE* b = (CF_BYTE*)pImage->pPixels; memcpy(buffer, b, bufsize); return status; }
/* Функция: CFDIBSize Цель: Возвращает размер буфера, необходимый для сохранения изображения в формате DIB Параметры: [ in ] hImage - дескриптор изображения [ out ] pSize - указатель на переменную, в которой будет сохранено значение размера буфера. Возвращаемые заначения: CF_SUCCESS - Переменная pSize cодержит значение размера буфера в противном случае возвращает код ошибки. */ CF_ERROR __EXPORT_TYPE CFDIBSize(CF_IMAGE hImage, int* pSize) { CF_ERROR status = CF_SUCCESS; // проверим входные параметры if (pSize == NULL) { return CFF_INVALID_PARAM; } TLFImage* image = (TLFImage*)hImage; if(image == NULL) { status = CFF_INVALID_HANDLE; *pSize = 0; return status; } *pSize = 0; awpImage* pImage = NULL; pImage = image->GetImage(); if (awpCheckImage(pImage) != AWP_OK) { status = CFF_INVALID_HANDLE; *pSize = 0; return status; } int dib_width = ((pImage->sSizeX*24 + 31)/32) * 4; /* aligned to 4 bytes */ *pSize = dib_width*pImage->sSizeY; return status; }
CF_ERROR __EXPORT_TYPE CFGetImageParams(CF_IMAGE hImage, CF_IMAGE_PARAMS* pParams) { CF_ERROR status = CF_SUCCESS; // проверим входные параметры if (pParams == NULL) { return CFF_INVALID_PARAM; } TLFImage* image = (TLFImage*)hImage; if(image == NULL) { status = CFF_INVALID_HANDLE; return status; } awpImage* pImage = NULL; pImage = image->GetImage(); if (awpCheckImage(pImage) != AWP_OK) { status = CFF_INVALID_HANDLE; return status; } pParams->width = pImage->sSizeX; pParams->height = pImage->sSizeY; switch(pImage->bChannels) { case 1: pParams->bpp = 8; break; case 3: pParams->bpp = 24; break; } return status; }
AWPRESULT awpScanImage(awpImage* pImage, awpRect* pRoi, awpScanner* pScanner, AWPINT* num, awpDetectItem** ppItems) { AWPRESULT res; if (pImage == NULL) return AWP_BADARG; if (pScanner == NULL) return AWP_BADARG; if (num == NULL) return AWP_BADARG; if (ppItems == NULL) return AWP_BADARG; if (awpCheckImage(pImage) != AWP_OK) return AWP_BADARG; if (pRoi != NULL && awpRectInImage(pImage, pRoi) != AWP_OK) return AWP_BADARG; res = AWP_OK; switch(pScanner->scannerType) { case AllScanner: res = _awpAllScanner(pImage, pRoi, pScanner, num, ppItems); break; case ScaleScanner: res = _awpScaleScanner(pImage, pRoi, pScanner, num, ppItems); break; case CameraScanner: res = _awpCameraScanner1(pImage, pRoi, pScanner, num, ppItems); break; } return res; }
CF_ERROR __EXPORT_TYPE CFGetDumpSize(CF_IMAGE hImage, CF_DWORD* pDumpSize) { CF_ERROR status = CF_SUCCESS; TLFImage* image = (TLFImage*)hImage; if(image == NULL) { status = CFF_INVALID_HANDLE; return status; } awpImage* pImage = NULL; pImage = image->GetImage(); if (awpCheckImage(pImage) != AWP_OK) { status = CFF_INVALID_HANDLE; return status; } if (pDumpSize == NULL) return CFF_INVALID_PARAM; //todo: здесь мы предполагаем, что изображения могут быть либо //полутоновыми, либо цветными, пиксели содержат только 1 байт на цвет *pDumpSize = pImage->sSizeX*pImage->sSizeY*(pImage->bChannels == 1?1:3); return status; }