Конвертировать UIImage в NSData
Я использую этот код в своем приложении, которое поможет мне отправить изображение.
Однако у меня есть изображение с изображением. У меня нет файла в appbundle, но у меня есть изображение. Как я могу изменить приведенный ниже код? Может ли кто-нибудь сказать мне, как я могу преобразовать 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"];
Ответы
Ответ 1
Попробуйте выполнить одно из следующих действий в зависимости от формата изображения:
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 пикселей. (Опустите бит CFBridgingRelease
если вы не используете ARC).
Ответ 2
NSData *imageData = UIImagePNGRepresentation(myImage.image);
Ответ 3
Если у вас есть изображение внутри UIImageView, например. "myImageView", вы можете сделать следующее:
Преобразуйте изображение с помощью UIImageJPEGRepresentation() или UIImagePNGRпредпечатайте() следующим образом:
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*
});
});
Ответ 4
Создайте ссылку на изображение....
UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];
отображение изображения в представлении изображения... imagedisplay является ссылкой на изображение:
imagedisplay.image = rainyImage;
преобразовать его в NSData
, передав ссылку UIImage
и предоставить качество сжатия в значениях float:
NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);
Ответ 5
Решение в Swift 4
extension UIImage {
var data : Data? {
return cgImage?.dataProvider?.data as Data?
}
}
Ответ 6
Использовать if-let блок с данными, чтобы предотвратить сбой приложения и безопасное выполнение кода, поскольку функция UIImagePNGRпредставляет новое значение.
if let img = UIImage(named: "TestImage.png") {
if let data:Data = UIImagePNGRepresentation(img) {
// Handle operations with data here...
}
}
Примечание. Данные - это класс Swift 3. Используйте данные вместо NSData с Swift 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...
}
}
Ответ 7
- (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];
}
Ответ 8
Конвертировать данные из изображения:
Попробуйте JPEG или PNG представление в зависимости от вашего формата изображения:
UIImageJPEGRepresentation
Возвращает данные для указанного изображения в формате JPEG.
NSData * UIImageJPEGRepresentation (
UIImage *image,
CGFloat compressionQuality
);
UIImagePNGRepresentation
Возвращает данные для указанного изображения в формате PNG
NSData * UIImagePNGRepresentation (
UIImage *image
);
Пример:
extension UIImage {
var pngRepresentationData: Data? {
return UIImagePNGRepresentation(img)
}
var jpegRepresentationData: Data? {
return UIImageJPEGRepresentation(self, 1.0)
}
}
Использование:
let data = myImage.jpegRepresentationData
let data1 = myImage.pngRepresentationData
Конвертировать изображение из данных:
let image = UIImage(data: data)