bool SkPDFDocumentToBitmap(SkStream* stream, SkBitmap* output) { size_t size = stream->getLength(); void* ptr = sk_malloc_throw(size); stream->read(ptr, size); CGDataProviderRef data = CGDataProviderCreateWithData(NULL, ptr, size, CGDataProviderReleaseData_FromMalloc); if (NULL == data) { return false; } CGPDFDocumentRef pdf = CGPDFDocumentCreateWithProvider(data); CGDataProviderRelease(data); if (NULL == pdf) { return false; } SkAutoPDFRelease releaseMe(pdf); CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1); if (NULL == page) { return false; } CGRect bounds = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); int w = (int)CGRectGetWidth(bounds); int h = (int)CGRectGetHeight(bounds); SkBitmap bitmap; if (!bitmap.allocPixels(SkImageInfo::MakeN32Premul(w, h))) { return false; } bitmap.eraseColor(SK_ColorWHITE); size_t bitsPerComponent; CGBitmapInfo info; getBitmapInfo(bitmap, &bitsPerComponent, &info, NULL); CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(bitmap.getPixels(), w, h, bitsPerComponent, bitmap.rowBytes(), cs, info); CGColorSpaceRelease(cs); if (ctx) { CGContextDrawPDFPage(ctx, page); CGContextRelease(ctx); } output->swap(bitmap); return true; }
bool SkPDFDocumentToBitmap(SkStream* stream, SkBitmap* output) { CGDataProviderRef data = SkCreateDataProviderFromStream(stream); if (NULL == data) { return false; } CGPDFDocumentRef pdf = CGPDFDocumentCreateWithProvider(data); CGDataProviderRelease(data); if (NULL == pdf) { return false; } SkAutoPDFRelease releaseMe(pdf); CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1); if (NULL == page) { return false; } CGRect bounds = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); int w = (int)CGRectGetWidth(bounds); int h = (int)CGRectGetHeight(bounds); SkBitmap bitmap; if (!bitmap.tryAllocN32Pixels(w, h)) { return false; } bitmap.eraseColor(SK_ColorWHITE); size_t bitsPerComponent; CGBitmapInfo info; getBitmapInfo(bitmap, &bitsPerComponent, &info, NULL); CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(bitmap.getPixels(), w, h, bitsPerComponent, bitmap.rowBytes(), cs, info); CGColorSpaceRelease(cs); if (ctx) { CGContextDrawPDFPage(ctx, page); CGContextRelease(ctx); } output->swap(bitmap); return true; }
static SkBitmap* prepareForImageRef(const SkBitmap& bm, size_t* bitsPerComponent, CGBitmapInfo* info) { bool upscaleTo32; if (!getBitmapInfo(bm, bitsPerComponent, info, &upscaleTo32)) { return NULL; } SkBitmap* copy; if (upscaleTo32) { copy = new SkBitmap; // here we make a ceep copy of the pixels, since CG won't take our // 565 directly bm.copyTo(copy, SkBitmap::kARGB_8888_Config); } else { copy = new SkBitmap(bm); } return copy; }
int main() { char *processedImageName = "processed.bmp"; char *fileName = "test.bmp"; int fileLenght = getLenghtOfFile(fileName); char *buffer = readFile(fileName, fileLenght); int* info = getBitmapInfo(buffer); printf("Szerokosc: %d\n", info[0]); printf("Wysokosc: %d\n", info[1]); printf("Poczatek danych: %d\n", info[2]); printf("Wielkosc pliku: %d bajtów\n", info[3]); printf("Bitów na pixel: %d-bits\n", info[4]); printf("Typ kompresji: %d\n", info[5]); char *data = getBitmapContent(buffer, info); remove(processedImageName); negateImage(data, fileLenght); saveFile(buffer, fileLenght, processedImageName); return 0; }