问题描述
|
我在我的应用程序中使用此代码,这将有助于我发送图像。
但是,我有一个带有图像的图像视图。我的文件中没有文件,但图像在我的身边。如何更改以下代码?谁能告诉我如何将
myimage
转换为NSData
?
// Attach an image to the email
Nsstring *path = [[NSBundle mainBundle] pathForResource:@\"rainy\" ofType:@\"jpg\"];
NSData *myData = [NSData dataWithContentsOfFile:path];
[picker addAttachmentData:myData mimeType:@\"image/jpeg\" fileName:@\"rainy\"];
解决方法
请尝试以下方法之一,具体取决于您的图像格式:
UIImageJPEGRepresentation
以JPEG格式返回指定图像的数据。
NSData * UIImageJPEGRepresentation (
UIImage *image,CGFloat compressionQuality
);
UIImagePNGRepresentation
以PNG格式返回指定图像的数据
NSData * UIImagePNGRepresentation (
UIImage *image
);
这里是文档。
编辑:
如果要访问组成UIImage的原始字节,则可以使用以下方法:
CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];
这将为您提供图像RGB像素的低级表示。
(如果不使用ARC,请省略ѭ6位)。
, NSData *imageData = UIImagePNGRepresentation(myImage.image);
, 如果您在UIImageView中有图片,例如\“ myImageView \”,您可以执行以下操作:
使用UIImageJPEGRepresentation()或UIImagePNGRepresentation()转换图像,如下所示:
NSData *data = UIImagePNGRepresentation(myImageView.image);
//or
NSData *data = UIImageJPEGRepresentation(myImageView.image,0.8);
//The float param (0.8 in this example) is the compression quality
//expressed as a value from 0.0 to 1.0,where 1.0 represents
//the least compression (or best quality).
您还可以将此代码放入GCD块中,并在另一个线程中执行,以显示在此过程中的UIActivityIndicatorView ...
//*code to show a loading view here*
dispatch_queue_t myQueue = dispatch_queue_create(\"com.my.queue\",DISPATCH_QUEUE_SERIAL);
dispatch_async(myQueue,^{
NSData *data = UIImagePNGRepresentation(myImageView.image);
//some code....
dispatch_async( dispatch_get_main_queue(),^{
//*code to hide the loading view here*
});
});
, 创建图像的参考。
UIImage *rainyImage = [UIImage imageNamed:@\"rainy.jpg\"];
在图像视图中显示图像... imagedisplay是imageview的引用:
imagedisplay.image = rainyImage;
通过传递UIImage
参考将其转换为NSData
并以浮点值提供压缩质量:
NSData *imgData = UIImageJPEGRepresentation(rainyImage,0.9);
, Swift 4中的解决方案
extension UIImage {
var data : Data? {
return cgImage?.dataProvider?.data as Data?
}
}
, 将if-let块与Data结合使用可防止应用崩溃和代码安全执行,因为函数UIImagePNGRepresentation返回一个可选值。
if let img = UIImage(named: \"TestImage.png\") {
if let data:Data = UIImagePNGRepresentation(img) {
// Handle operations with data here...
}
}
注意:数据是Swift 3类。使用Data代替NSData
迅捷3
通用图像操作(如png和jpg均如此):
if let img = UIImage(named: \"TestImage.png\") { //UIImage(named: \"TestImage.jpg\")
if let data:Data = UIImagePNGRepresentation(img) {
handleOperationWithData(data: data)
} else if let data:Data = UIImageJPEGRepresentation(img,1.0) {
handleOperationWithData(data: data)
}
}
*******
func handleOperationWithData(data: Data) {
// Handle operations with data here...
if let image = UIImage(data: data) {
// Use image...
}
}
通过使用扩展名:
extension UIImage {
var pngRepresentationData: Data? {
return UIImagePNGRepresentation(img)
}
var jpegRepresentationData: Data? {
return UIImageJPEGRepresentation(self,1.0)
}
}
*******
if let img = UIImage(named: \"TestImage.png\") { //UIImage(named: \"TestImage.jpg\")
if let data = img.pngRepresentationData {
handleOperationWithData(data: data)
} else if let data = img.jpegRepresentationData {
handleOperationWithData(data: data)
}
}
*******
func handleOperationWithData(data: Data) {
// Handle operations with data here...
if let image = UIImage(data: data) {
// Use image...
}
}
, - (void) imageConvert
{
UIImage *snapshot = self.myImageView.image;
[self encodeImageToBase64String:snapshot];
}
call this method for image convert in base 64
-(NSString *)encodeImageToBase64String:(UIImage *)image
{
return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}