0

更新 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 のイメージが取得されます。(別の暫定的なアプローチが下部に記載されています。)

以下のコードは Brandon Trebitowski の

    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];
4

1 に答える 1

0

2 行を変更して 3 行を追加したところ、目的の結果が得られました。主な変更点は、画像が描画される前に再スケーリングを実行できるように、UIGraphicsBeginImageContextWithOptions代わりにを使用することでした。UIGraphicsBeginImageContext

@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));
    UIGraphicsBeginImageContextWithOptions(CGSizeMake( 104,104), NO, 0.125);  // Changed
    CGContextRef con = UIGraphicsGetCurrentContext();
    CGContextDrawImage(con, CGRectMake(0, 0, 104, 104) ,num);  // Changed
    UIImage* im = UIGraphicsGetImageFromCurrentImageContext();  // Added
    UIGraphicsEndImageContext();
    self.workingImage = CFBridgingRelease(num);
    CGImageRelease(num);


    UIImageView* iv = [[UIImageView alloc] initWithImage:im];   // Added
    [self.imageView addSubview: iv];  // Added
    CGImageRef imageRef = [im CGImage];
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);

于 2013-01-25T20:02:03.547 に答える