更新 1
ここで、CGDataProviderCopyData について説明している有望な Apple ドキュメントを見つけました。これは、コンテキストから描画を取得し、ピクセル値を抽出することで、私が最初に尋ねたことを実行していると思います。
サンプルコードで使用CGImageGetDataProvider
されている機能と、私が理解していないその他の機能がいくつかあるため、それらの機能を実装する方法がわかりません。con
変数またはそのコンテキストから情報を取得し、ピクセルにアクセスするにはどうすればよいですか?
更新 1
更新 0
多分私はここで間違った質問をしています。CGContextDrawImage
私の場合、画像を104 x 104から13 x 13にスケーリングしますが、その後CGContextDrawImage
画像を表示します。CGContextDrawImage
たぶん、スケーリングを行うだけの部分を見つける必要があります。
initWithData:scale:
「UIImage Class Reference」で見つけました。しかし、そのメソッドにデータを提供する方法がわかりません。必要なスケールは 0.25 です。
- (id)initWithData:(NSData *)data scale:(CGFloat)scale
(NSData *)data
アプリに を提供する方法を誰か教えてもらえますか?
更新 0
//
// BSViewController.m
#import "BSViewController.h"
@interface BSViewController ()
@end
@implementation BSViewController
- (IBAction) chooseImage:(id) sender{
[self.view addSubview:self.imageView];
UIImage* testCard = [UIImage imageNamed:@"ipad 7D.JPG"];
CGSize sz = [testCard size];
CGImageRef num = CGImageCreateWithImageInRect([testCard CGImage],CGRectMake(532, 0, 104, 104));
UIGraphicsBeginImageContext(CGSizeMake( 250,650));
CGContextRef con = UIGraphicsGetCurrentContext();
CGContextDrawImage(con, CGRectMake(0, 0, 13, 13) ,num);
UIGraphicsEndImageContext();
self.workingImage = CFBridgingRelease(num);
CGImageRelease(num);
私は上から下への移行に取り組んでいます。
具体的には、imageRef に正しい入力を与える必要があります。imageRef に 13 x 13 のイメージを指定したいのですが、imageRef を指定num
すると 104 x 104 のイメージがcon
取得され、imageRef を指定すると 0 x 0 のイメージが取得されます。(別の暫定的なアプローチが下部に記載されています。)
CGImageRef imageRef = num;
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
NSLog(@"the width: %u", width);
NSLog(@"the height: %u", height);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);
NSLog(@"Stop 3");
// Now your rawData contains the image data in the RGBA8888 pixel format.
int byteIndex = (bytesPerRow * 0) + 0 * bytesPerPixel;
for (int ii = 0 ; ii < width * height ; ++ii)
{
int outputColor = (rawData[byteIndex] + rawData[byteIndex+1] + rawData[byteIndex+2]) / 3;
rawData[byteIndex] = (char) (outputColor);
rawData[byteIndex+1] = (char) (outputColor);
rawData[byteIndex+2] = (char) (outputColor);
byteIndex += 4;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
self.workingImage
また、次の 2 つの方法のいずれかを定義し、それを に提供する実験も行いましたimageRef
。
self.workingImage = num;
self.workingImage = (__bridge UIImage *)(num);
CGImageRef imageRef = [self.workingImage CGImage];