Я пытаюсь извлечь все изображения в формате PDF, а затем преобразовать их в формат DIB. Первая часть проста. Я извлекаю все содержимое в PDF, затем перебираю их, и всякий раз, когда я нахожу PDEImage, я помещаю их в массив.
Но я не представляю, что делать со второй частью. Похоже, что все методы AVConversion позволяют конвертировать целую страницу PDF, а не только изображения, в другие форматы.
Есть ли способ, которым я могу выполнить эту задачу? Заранее спасибо!
РЕДАКТИРОВАТЬ: дальнейшая разработка проблемы.
Я пишу плагин Adobe Acrobat с использованием Visual C ++ с .NET Framework 4.
Назначение плагина состоит в том, чтобы (помимо прочего) извлечь данные изображения из файла PDF, а затем преобразовать эти данные в DIB. Необходимость преобразования в DIS заключается в том, что я затем передаю эти DIB в другую библиотеку, которая выполняет на них некоторую коррекцию изображения.
Теперь моя проблема заключается в преобразовании указанных данных изображения в PDF-файлах в DIB. Данные изображения в PDF-файлах находятся в формате PDEImage (Ref Link), где, по-видимому, они содержат все данные о цвете изображения. Теперь я использую следующий код для извлечения указанных битов данных изображения из изображения, которое будет использоваться с CreateCompatibleBitmap () и SetBitmapBits () для получения дескриптора HBITMAP. Затем я передаю это вместе с другими необходимыми параметрами в GetDIBits (), чтобы получить DIB в виде байтового массива, как указано в MSDN.
void GetDIBImage(PDEElement element)
{
//Obtaining a PDEImage
PDEImage image;
memset(&image, 0, sizeof(PDEImage));
image = (PDEImage)element;
//Obtaining attributes (such as width, height)
//of the image for later use
PDEImageAttrs attrs;
memset(&attrs, 0, sizeof(attrs));
PDEImageGetAttrs(image, &attrs, sizeof(attrs));
//Obtainig image data from PDEImage to a byte array
ASInt32 len = PDEImageGetDataLen(image);
byte *data = (byte *)malloc(len);
PDEImageGetData(image, 0, data);
//Creating a DDB using said data
HDC hdc = CreateCompatibleDC(NULL);
HBITMAP hBmp = CreateCompatibleBitmap(hdc, attrs.width, attrs.height);
LONG bitsSet = SetBitmapBits(hBmp, len, data); //Here bitsSet gets a value of 59000 which is close to the image's actual size
//Buffer which GetDIBits() will fill with DIB data
unsigned char* buff = new unsigned char[len];
//BITMAPINFO stucture to be passed to GetDIBits()
BITMAPINFO bmpInfo;
memset(&bmpInfo, 0, sizeof(bmpInfo));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = (LONG)attrs.width;
bmpInfo.bmiHeader.biHeight = (LONG)attrs.height;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 8;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biSizeImage = ((((bmpInfo.bmiHeader.biWidth * bmpInfo.bmiHeader.biBitCount) + 31) & ~31) >> 3) * bmpInfo.bmiHeader.biHeight;
bmpInfo.bmiHeader.biXPelsPerMeter = 0;
bmpInfo.bmiHeader.biYPelsPerMeter = 0;
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;
//Callling GetDIBits()
//Here scanLines get a value of 0, while buff receives no data.
int scanLines = GetDIBits(hdc, hBmp, 0, attrs.height, &buff, &bmpInfo, DIB_RGB_COLORS);
if(scanLines > 0)
{
MessageBox(NULL, L"SUCCESS", L"Message", MB_OK);
}
else
{
MessageBox(NULL, L"FAIL", L"Message", MB_OK);
}
}
Вот мои вопросы / проблемы.
Правильно ли я использую функции CreateCompatibleDC (), CreateCompatibleBitmap () и SetBitmapBits ()? Я думаю, что я использую CreateCompatibleDC () для получения текущего DC, затем создаю DDB с помощью CreateCompatibleBitmap () и затем устанавливаю фактические данные в DDB с помощью SetBitmapBits (). Это правильно?
Есть ли проблема с тем, как я создал структуру BITMAPINFO. Я предполагаю, что он должен содержать все детали относительно формата DIB, который я в конечном итоге получу.
Почему я не получаю растровые данные в виде DIB в бафф, когда я вызываю GetDIBits ()?