Ich verwende diesen Code in meiner App, der mir hilft, ein Bild zu senden.
Ich habe jedoch eine Bildansicht mit einem Bild. Ich habe keine Datei in appbundle, aber ich habe das Bild auf meiner Seite. Wie kann ich den Code unten ändern? Kann mir jemand sagen, wie ich myimage
in NSData
konvertieren kann?
// 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"];
Probieren Sie je nach Bildformat einen der folgenden Schritte aus:
UIImageJPEGRepräsentation
Gibt die Daten für das angegebene Bild im JPEG-Format zurück.
NSData * UIImageJPEGRepresentation (
UIImage *image,
CGFloat compressionQuality
);
UIImagePNGRepräsentation
Gibt die Daten für das angegebene Bild im PNG-Format zurück
NSData * UIImagePNGRepresentation (
UIImage *image
);
BEARBEITEN:
wenn Sie auf die rohen Bytes des UIImage zugreifen möchten, können Sie diesen Ansatz verwenden:
CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];
Dadurch erhalten Sie die Low-Level-Darstellung der RGB-Pixel des Bildes. (Lassen Sie das CFBridgingRelease
-Bit aus, wenn Sie nicht ARC verwenden).
NSData *imageData = UIImagePNGRepresentation(myImage.image);
Wenn Sie ein Bild in einer UIImageView haben, z. "myImageView" können Sie Folgendes tun:
Konvertieren Sie Ihr Bild mit UIImageJPEGRepresentation () oder UIImagePNGRepresentation () wie folgt:
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).
Sie können diesen Code auch in einen GCD-Block einfügen und in einem anderen Thread ausführen, wobei während des Prozesses ein UIActivityIndicatorView angezeigt wird.
//*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*
});
});
Erstellen Sie die Referenz des Bildes ....
UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];
anzeige des Bildes in der Bildansicht ... Imagedisplay ist eine Referenz der Bildansicht:
imagedisplay.image = rainyImage;
konvertieren Sie es in NSData
, indem Sie UIImage
übergeben und geben Sie die Kompressionsqualität in Float-Werten an:
NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);
Lösung in Swift 4
extension UIImage {
var data : Data? {
return cgImage?.dataProvider?.data as Data?
}
}
Verwenden Sie den if-let-Block mit Data, um den Absturz der App und die sichere Ausführung von Code zu verhindern, da die Funktion UIImagePNGRepresentation einen optionalen Wert zurückgibt.
if let img = UIImage(named: "TestImage.png") {
if let data:Data = UIImagePNGRepresentation(img) {
// Handle operations with data here...
}
}
Hinweis: Daten ist Swift 3 Klasse. Verwenden Sie Daten anstelle von NSData mit Swift 3
Generische Bildoperationen (wie png & jpg beide):
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...
}
}
Mit der Erweiterung:
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];
}