【问题标题】:iphone store image in application which are chosen from gallery从图库中选择的应用程序中的 iphone 商店图像
【发布时间】:2011-03-10 05:04:31
【问题描述】:

我在谷歌搜索了很多,但无法得到所需的答案。我正在从图片库中选择照片,并将其存储在我的应用程序中。如果我必须将它存储在数据库中(作为 BLOB),那么我必须输入文件的名称(我没有从图库中选择)。我可以将它存储在其他任何地方吗?请帮忙。很长一段时间以来,我都陷入了困境。我需要提取图像并将其显示在地图标注视图中。

我正在使用下面的代码从图库中选择照片并插入到数据库中

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)dictionary {
        [picker dismissModalViewControllerAnimated:YES];
    tempImg.image = image;
    NSData *imgData = UIImagePNGRepresentation(tempImg.image);
        NSLog(@"the img data %@",imgData);

sql = [NSString stringWithFormat:@"update latlng set image = '%@' where placeName = '%@'",imgData,pName.text];

执行上述sql语句的以下代码

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        const char *sqlStatement;
        sqlStatement = [sql UTF8String];;

        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
        {
            if (sqlite3_step(compiledStatement))
            {
                NSLog(@"YES");
            }
        }
        else 
        {
            printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database));
        }
        sqlite3_finalize(compiledStatement);

    }sqlite3_close(database);

以下代码从数据库中提取

NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement, 5) length:sqlite3_column_bytes(compiledStatement, 5)];

以下代码在标注中显示图像

UIImageView *mapImg = [[UIImageView alloc] initWithImage [UIImageimageWithData:imgData]];
pinView.leftCalloutAccessoryView = mapImg;

【问题讨论】:

    标签: iphone database image uiimagepickercontroller


    【解决方案1】:

    将照片库获取的图像转换为 NSData,然后将其作为 Blob 保存在数据库中,这样您就可以在需要时轻松地从数据库中检索 nsdata。

    NSData *image1Data = UIImagePNGRepresentation(image1.image);
    sqlite3_bind_blob(init_statement, 1, [image1Data bytes], [image1Data length], NULL);
    

    image1 是我在其中显示照片库中的图像的 ImageView。

    一切顺利。

    【讨论】:

    • 感谢您的回答。我现在尝试了上述方法。但是在转换为 nsdata 时,应用程序崩溃了。我在那里放了一个nslog并尝试了。 IT 只是显示图像被加密,但它并没有停止。然后崩溃。请帮忙。
    • 以上代码适用于少数图片。但对于少数人来说。会不会是尺寸的原因?我已经用代码编辑了我的问题
    • 我没有收到任何崩溃日志。它只是在没有信息的情况下崩溃。我在日志末尾能看到的只有数字 27a731a6 83cc8c89 60267940 8
    • 在我的情况下它工作正常,我也检查了你的代码。它工作正常。你确定你没有泄漏内存。
    • @warrior 不,我不是。我检查了那个。它对我来说也很好用,但是当我选择从互联网下载的几张图片时会崩溃。会不会是图片大小的原因?
    【解决方案2】:

    您可以使用它来检索应用程序可写目录的路径:

    NSString *directory = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    

    有多种方法可以访问该目录,包括 NSData 的 writeToFile: 方法、NSFileManager 类、NSFileHandle 类,甚至 C stdio 函数。

    【讨论】:

    • 感谢失范。你能告诉我如何将图像存储在我从图片库中获得的目录中。
    • 您可以使用UIImageJPEGRepresentation 将其转换为NSData,然后使用NSData 的writeToFile 将其写出来,或者您可以使用CGImageDestination。或者可能还有其他方法。
    【解决方案3】:

    在我的情况下,我搜索了很多谷歌,然后最终得到了解决方案,下面的代码对我有用,我希望它对你有用

    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    
    
    NSLog(@"info: %@",info);
    
    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirec = [paths objectAtIndex:0];
    NSString *imgePath = [documentsDirec stringByAppendingPathComponent:@"note.sqlite"];
    
    if(sqlite3_open([imgePath UTF8String], &database) == SQLITE_OK){
    
        const char *sql = "insert into images (images) values (?)";
        if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) == SQLITE_OK){
            UIImage *edtedImae = [info objectForKey:UIImagePickerControllerOriginalImage];
            NSData *dataForImage = UIImagePNGRepresentation(edtedImae);
            sqlite3_bind_blob(addStmt, 1, [dataForImage bytes], [dataForImage length], SQLITE_TRANSIENT);
        }
        if(sqlite3_step(addStmt) != SQLITE_DONE){
    
            NSLog(@"error %s",sqlite3_errmsg(database));
        }
        else {
            NSLog(@"Insert row Id = %d",sqlite3_last_insert_rowid(database));
        }
        sqlite3_finalize(addStmt);
    
        }
       sqlite3_close(database);               
       [picker dismissModalViewControllerAnimated:YES];
    }
    

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多