Я хочу извлечь изображение из pdf и сохранить дескриптор изображения в std::vector, иногда фон неверен, мой код следует.
BOOL CTextEditorDoc::loadImage()
{
if(m_strPDFPath.IsEmpty())
return FALSE;
CString strFile;
fz_context *ctx;
fz_document* doc;
fz_device *dev;
fz_irect bbox;
fz_rect bounds;
fz_matrix ctm;
fz_pixmap *image;
fz_colorspace *colorspace;
int i,j,rotation = 0;
int pagecount = 0;
fz_page *page;
BITMAPINFO bmi;
HBITMAP hBitmap;
LPBYTE pDest,pImage;
if(!gb2312toutf8(m_strPDFPath,strFile))
return FALSE;
ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
fz_try(ctx){
doc = fz_open_document(ctx,strFile.GetBuffer(0));
}fz_catch(ctx){
fz_free_context(ctx);
return FALSE;
}
fz_rotate(&ctm, rotation);
colorspace = fz_device_rgb(ctx);
pagecount = fz_count_pages(doc);
pDest = NULL;
::ZeroMemory(&bmi, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biWidth = 180;
bmi.bmiHeader.biHeight = -180;
bmi.bmiHeader.biSizeImage = 180*180*4;
for(i=0;i<pagecount;i++){
page = fz_load_page(doc,i);
if(i == 0){
fz_bound_page(doc,page,&bounds);
fz_pre_scale(&ctm,180/(bounds.x1 - bounds.x0),180/(bounds.y1 - bounds.y0));
fz_transform_rect(&bounds, &ctm);
fz_round_rect(&bbox, &bounds);
}
image = fz_new_pixmap_with_bbox(ctx,colorspace,&bbox);
dev = fz_new_draw_device(ctx,image);
fz_try(ctx){
fz_run_page(doc,page,dev,&ctm,NULL);
}fz_catch(ctx){
fz_drop_pixmap(ctx,image);
fz_free_device(dev);
fz_free_page(doc, page);
continue;
}
pImage = image->samples;
if(pImage){
pDest = NULL;
hBitmap = ::CreateDIBSection(NULL,&bmi,DIB_RGB_COLORS,(void**)&pDest,NULL,0);
ASSERT(hBitmap);
if(image->n == 2){ //not pallet
for (j = 180* 180; j > 0 ; j--){
pDest[0] = pDest[1] = pDest[2] = *pImage++;
pDest[3] = *pImage++;
pDest += 4;
}
}else if(image->n == 4){
//memcpy(pDest,pImage,m_thumbWidth * m_thumbHeight*4);
for (j = 180* 180; j > 0 ; j--){
pDest[0] = *pImage++;
pDest[1] = *pImage++;
pDest[2] = *pImage++;
pDest[3] = *pImage++;
pDest += 4;
}
}else ASSERT(FALSE);
m_imageVector.push_back(hBitmap);// save it to std::vector
}
fz_drop_pixmap(ctx,image);
fz_free_device(dev);
fz_free_page(doc, page);
}
fz_close_document(doc);
fz_free_context(ctx);
return TRUE;
}
этот код может извлекать все изображения из pdf, но может быть слишком медленным, как его улучшить? иногда фон изображения неправильный?
Слева от следующего изображения неверно, справа от следующего изображения является реальным.