2013-07-15 11 views
5

Mam plik .png w folderze z zasobami. (Rzeczywisty rozmiar to 411 KB) Kiedy konwertuję plik uiimage na nsdata i próbuję uzyskać dostęp do właściwości length, daje mi to błąd wartość.Właściwość length zwraca nieprawidłowy rozmiar (bajty) dla obrazu

Kod ...

UIImage *image = [UIImage imageNamed:@"sample.png"]; 

NSData *imgData = [[NSData alloc] initWithData:UIImageJPEGRepresentation(image, 1.0)]; 
int imageSize = imgData.length; 
NSLog(@"Image size in KB is %d",imageSize/1024); //-------- returns 631 KB 

Proszę dać mi znać, jeśli istnieje jakakolwiek inna nieruchomość, która pomaga ..


Więc tutaj jest mój wymóg .... chcę wiedzieć rozmiar obrazu, który wybieram z uimagepicker. Dokładny rozmiar obrazu, gdy widzę go w wizjerze, a rozmiar, który powraca do mnie po wybraniu go z biblioteki, jest zupełnie inny ... Czy istnieje jakaś inna właściwość, która może być użyta zamiast długości?

+2

631 Kb to ilość pamięci jaką zajmuje imgData. Nie ma to bezpośredniego związku ze sposobem przechowywania obrazu w rzeczywistym pliku. Jeśli chcesz uzyskać rozmiar pliku, użyj systemu plików. –

+0

@RobvanderWyraźnie długość danych i rozmiar pliku miałby "bezpośrednią relację". W tym przypadku powinny być dokładnie równe. Oznacza to, że dane są odczytywane bezpośrednio z pliku, który nie jest. Stąd problem. – matt3141

+0

@ matt3141 najpierw zgadzam się, że twoja odpowiedź jest właściwa. Ale plik nie jest tylko wczytywany do pamięci, jest czytany i przetwarzany. Stąd stosunek do przechowywania plików nie jest "bezpośredni". –

Odpowiedz

1

spróbuj tego:

unsigned int len = [data length]; 
uint32_t little = (uint32_t)NSSwapHostIntToLittle(len); 
NSData *byteData = [NSData dataWithBytes:&little length:4]; 
+1

Przynajmniej wyjaśnij, co robi. –

+0

Nie działa dla mnie .. – NSPratik

4

konwertowania PNG do JPEG, a więc różny rozmiar pliku należy się spodziewać.

Jeśli chcesz uzyskać rozmiar pliku oryginału, obraz png, wykonaj następujące czynności.

NSString *path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"png"]; 
NSData *rawData = [NSData dataWithContentsOfFile:path]; 
NSLog(@"%d", rawData.length); 
+0

Dlaczego po prostu nie zapytać systemu plików, jak duży jest plik? –

+0

@HotLicks Przyjąłem, że plakat chciał mieć więcej niż tylko rozmiar pliku, ponieważ w przeciwnym razie mógłby po prostu napisać 'int imageSize = 411000;' (biorąc pod uwagę, że pakiet nie jest zapisywalny) – matt3141

0

Po załadowaniu zdjęcia rozpakowałeś go. Po utworzeniu "imgData" obraz nie został skompresowany przy użyciu tego samego algorytmu. Nie ma powodu, by oczekiwać, że oboje będą mieli tę samą wielkość.

Powiązane problemy