- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个原型(prototype)来证明从一种格式到另一种格式的 RAW 转换是可能的。我必须将尼康的 .NEF 格式的原始文件转换为佳能的 .CR2 格式。在各种帖子的帮助下,我创建了原始图像 TIFF 表示形式的 BitmapImageRep,并使用它来编写扩展名为 .CR2 的输出文件。
它确实有效,但对我来说唯一的问题是,输入文件为 21.5 MB,但输出为 144.4 MB。使用 NSTIFFCompressionPackBits
时,我得到了 142.1 MB。
我想了解发生了什么,我尝试了各种可用的压缩枚举,但没有成功。
请帮我理解一下。这是源代码:
@interface NSImage(RawConversion)
- (void) saveAsCR2WithName:(NSString*) fileName;
@end
@implementation NSImage(RawConversion)
- (void) saveAsCR2WithName:(NSString*) fileName
{
// Cache the reduced image
NSData *imageData = [self TIFFRepresentation];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
// http://www.cocoabuilder.com/archive/cocoa/151789-nsbitmapimagerep-compressed-tiff-large-files.html
NSDictionary *imageProps = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:NSTIFFCompressionJPEG],NSImageCompressionMethod,
[NSNumber numberWithFloat: 1.0], NSImageCompressionFactor,
nil];
imageData = [imageRep representationUsingType:NSTIFFFileType properties:imageProps];
[imageData writeToFile:fileName atomically:NO];
}
@end
如何获得 CR2 格式的输出文件,但其大小几乎与输入文件大小相同,且几乎没有 CR2 文件所需的变化?
编辑 1:根据 Peter 使用 CGImageDestinationAddImageFromSource 方法的建议完成了更改,但我仍然得到相同的结果。输入源 NEF 文件大小为 21.5 MB,但转换后目标文件大小为 144.4 MB。
请检查代码:
-(void)saveAsCR2WithCGImageMethodUsingName:(NSString*)inDestinationfileName withSourceFile:(NSString*)inSourceFileName
{
CGImageSourceRef sourceFile = MyCreateCGImageSourceRefFromFile(inSourceFileName);
CGImageDestinationRef destinationFile = createCGImageDestinationRefFromFile(inDestinationfileName);
CGImageDestinationAddImageFromSource(destinationFile, sourceFile, 0, NULL);
//https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/ImageIOGuide/ikpg_dest/ikpg_dest.html
CGImageDestinationFinalize(destinationFile);
}
CGImageSourceRef MyCreateCGImageSourceRefFromFile (NSString* path)
{
// Get the URL for the pathname passed to the function.
NSURL *url = [NSURL fileURLWithPath:path];
CGImageSourceRef myImageSource;
CFDictionaryRef myOptions = NULL;
CFStringRef myKeys[2];
CFTypeRef myValues[2];
// Set up options if you want them. The options here are for
// caching the image in a decoded form and for using floating-point
// values if the image format supports them.
myKeys[0] = kCGImageSourceShouldCache;
myValues[0] = (CFTypeRef)kCFBooleanTrue;
myKeys[1] = kCGImageSourceShouldAllowFloat;
myValues[1] = (CFTypeRef)kCFBooleanTrue;
// Create the dictionary
myOptions = CFDictionaryCreate(NULL, (const void **) myKeys,
(const void **) myValues, 2,
&kCFTypeDictionaryKeyCallBacks,
& kCFTypeDictionaryValueCallBacks);
// Create an image source from the URL.
myImageSource = CGImageSourceCreateWithURL((CFURLRef)url, myOptions);
CFRelease(myOptions);
// Make sure the image source exists before continuing
if (myImageSource == NULL){
fprintf(stderr, "Image source is NULL.");
return NULL;
}
return myImageSource;
}
CGImageDestinationRef createCGImageDestinationRefFromFile (NSString *path)
{
NSURL *url = [NSURL fileURLWithPath:path];
CGImageDestinationRef myImageDestination;
//https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/ImageIOGuide/ikpg_dest/ikpg_dest.html
float compression = 1.0; // Lossless compression if available.
int orientation = 4; // Origin is at bottom, left.
CFStringRef myKeys[3];
CFTypeRef myValues[3];
CFDictionaryRef myOptions = NULL;
myKeys[0] = kCGImagePropertyOrientation;
myValues[0] = CFNumberCreate(NULL, kCFNumberIntType, &orientation);
myKeys[1] = kCGImagePropertyHasAlpha;
myValues[1] = kCFBooleanTrue;
myKeys[2] = kCGImageDestinationLossyCompressionQuality;
myValues[2] = CFNumberCreate(NULL, kCFNumberFloatType, &compression);
myOptions = CFDictionaryCreate( NULL, (const void **)myKeys, (const void **)myValues, 3,
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
//https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/ImageIOGuide/imageio_basics/ikpg_basics.html#//apple_ref/doc/uid/TP40005462-CH216-SW3
CFStringRef destFileType = CFSTR("public.tiff");
// CFStringRef destFileType = kUTTypeJPEG;
CFArrayRef types = CGImageDestinationCopyTypeIdentifiers(); CFShow(types);
myImageDestination = CGImageDestinationCreateWithURL((CFURLRef)url, destFileType, 1, myOptions);
return myImageDestination;
}
编辑2:使用@Peter告诉的第二种方法。这给出了有趣的结果。其效果与在查找器中将文件重命名为“example_image.NEF”至“example_image.CR2”相同。令人惊讶的是,当以编程方式和在 finder 中进行转换时,21.5 MB 的源文件将变成 59 KB。代码中没有任何压缩集。请查看代码并提出建议:
-(void)convertNEFWithTiffIntermediate:(NSString*)inNEFFile toCR2:(NSString*)inCR2File
{
NSData *fileData = [[NSData alloc] initWithContentsOfFile:inNEFFile];
if (fileData)
{
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:fileData];
// [imageRep setCompression:NSTIFFCompressionNone
// factor:1.0];
NSDictionary *imageProps = nil;
NSData *destinationImageData = [imageRep representationUsingType:NSTIFFFileType properties:imageProps];
[destinationImageData writeToFile:inCR2File atomically:NO];
}
}
最佳答案
我要尝试的第一件事根本不涉及 NSImage 或 NSBitmapImageRep。相反,我会为源文件创建一个 CGImageSource,为目标文件创建一个 CGImageDestination,并使用 CGImageDestinationAddImageFromSource
将所有图像从 A 传输到 B。
关于cocoa - NSImage + NSBitmapImageRep = 将 RAW 图像文件从一种格式转换为另一种格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458566/
我有一个包含 JPEG 图像数据的缓冲区。我需要在 UIImageView 中显示此图像。我需要将此图像缓冲区转换为 UIImage 对象并按如下方式使用它 NSData *data = [NSDat
我有一个 char* 数据数组,它是 RGBA 格式,然后移至 ARGB 底线是设置的应用程序图像看起来完全困惑,我无法指出为什么? //create a bitmap representat
有没有办法在具有子像素抗锯齿功能的 NSBitMapImageRep 中绘制文本?文本绘制在不透明的白色背景上,我尝试使用 CGContextSetShouldSmoothFonts 函数,但这似乎没
首先:我想使用NSBezierPath在我的应用程序中绘制一些简单的按钮图稿,所以我想我应该创建一个 NSBitmapImageRep ,得到CGImage ,创建一个NSImage然后在按钮上调用
我尝试构建图像。逐个像素。所以首先我构建了一些类,它可以在每个像素上循环绘制不同的颜色。但它仅在将 alpha 设置为 255 时才有效。更改 alpha 会使颜色变暗并改变图片。大小和位置都可以。
我正在尝试将 NSImage 读入 NSBitmapImageRep,以更改某些像素的颜色。程序应该读取每个像素的颜色值,并检查它是否等于颜色池选择的颜色。我有一个名为“MainImageView”的
所以...我将图像加载到 NSBitmapImageRep 对象中,因此我能够通过二维数组检查特定像素的内容。现在我想对图像应用一些“转换”,为一些额外的处理做准备。如果我在 Photoshop 中手
我想使用 NSBitmapImageRep 在代码中构造一个 64x64 像素的 Sprite ,然后将其绘制到屏幕上,放大得很大。结果将是屏幕上出现非常大的“像素”。想想老派的《马里奥兄弟》或《我的
我有一种方法可以分析从 CGImageRef 构建的 NSBitmapImageRep 内的像素数据。相关代码如下: CGImageRef ref; // omitted code for initi
我正在开发我的第一个 10.5+ 版本的 mac osx cocoa 应用程序,其中我有一个 CVImageBufferRef (使用 QTKit 捕获),我需要通过 TCP 套接字将此图像传输到客户
获取 NSBitmapImageRep 的大小(宽度和高度)的最佳方法是什么? 这就是我现在正在做的事情: NSBitmapImageRep *bitmap; NSInteger samplesPer
我正在尝试创建内存中图像,在其上绘制并保存到磁盘。 当前代码是: NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
我有一个像这样创建的NSBitmapImageRep: NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc]
我想了解在构建 NSBitmapImageRep 时如何计算“bytesPerRow”(在我的例子中是从将 float 组映射到灰度位图)。 澄清这个细节将帮助我理解内存如何从 float 组映射到字
如何在 NSImageView 中绘制 NSBitmapImageRep? 最佳答案 NSImage *im = [[[NSImage alloc] init] autorelease]; [im a
我在 C++ 应用程序中使用 Objective-C 在 OSX 上加载图像。它是一个 OpenGL 应用程序。这是我用来将图像加载到 opengl 中的代码: bool OSXSpecifics::
我有一个用 xcode 6.1 创建的 osx xcode 项目我想用它来训练一下 SWIFT 的使用。 在我的一个观点中,我尝试创建一个 NSBitMapImageRep,如下所示: class B
如何将 NSImage 转换为 NSBitmapImageRep?我有代码: - (NSBitmapImageRep *)bitmapImageRepresentation { NSBitma
我正在尝试编写一个原型(prototype)来证明从一种格式到另一种格式的 RAW 转换是可能的。我必须将尼康的 .NEF 格式的原始文件转换为佳能的 .CR2 格式。在各种帖子的帮助下,我创建了原始
我正在尝试创建一个每个样本 32 位和一个 Alpha channel (每像素总共 128 位)的 NSBitmapImageRep 对象。 我的代码如下所示: let renderSize = N
我是一名优秀的程序员,十分优秀!