Zapis obrazka/zdjęcia do pliku.

0

Witam!!

Mam takie pytanie czy da się zapisać zdjęcie wraz z opisem do pliku binarnego??

Chodzi mi o to że muszę napisać taki program w którym użytkownik podaje ścieżkę do pliku i opis do tego zdjęcia a następnie zapisuje to wszystko w jednym pliku binarnym.
Myślałem tak na "sucho" czy nie dało by się tego zrobić przy użyciu typu rekordowego?

Da się w ogóle zapisać zdjęcie do pliku?? Jeżeli tak to mogę prosić o jakieś wskazówki?? Nie oczekuję gotowca ale podpowiedzi :)

Pozdro

0

Eeee... a czym jest np. plik jpg ze zdjęciem, jeśli nie... plikiem ? Wszystko, co chcesz możesz zapisywać. Nie ma żadnych ograniczeń.

0

Wiem że jest plikiem ale chodzi mi o coś takiego że:

Użytkownik wybiera zdjęcie z dysku następnie pisze jakiś tekst i to wszystko (tekst ze zdjęciem) zapisuje do JEDNEGO pliku. Następnie może otworzyc taki plik a na ekranie wyświetla mu się zdjęcie wraz z opisem.

Jeżeli da się to zrobić to jest to skomplikowane?? Sa jakieś poradniki jak coś takiego lub podobnego zrobić??

0
  1. Zapisujesz do pliku, ile bajtów będzie zajmował opis (czyli ilość liter)
  2. Zapisujesz do pliku kolejne bajty opisu (litery)
  3. Przepisujesz zawartość pliku z obrazkiem, jak leci (cała reszta pliku)

Odczyt:

  1. Odczytujesz pierwszy bajt - długość napisu
  2. Odczytujesz n bajtów opisu
  3. Odczytujesz resztę bajtów - obrazek
0

Ok dzięki powoli zaczynam rozumieć o co chodzi.

Mam tylko wątpliwości co do odczytu i zapisu samego obrazka. Co do zapisu to "otworzyć" plik z obrazkiem a następnie zapisać wszystko co jest do tego pliku z tekstem-OK.
Ale teraz odczyt. Teoretycznie odczytam ten tekst wyświetlę go na ekranie (bo to pojedyncze litery) ale jak wyświetlić ten obrazek (złożyć te bajty w całość żeby wyświetlił się obraz)??

0

Myślę, że najbardziej łopatologiczną metodą byłoby zapisanie ich do pliku tymczasowego a następnie wczytanie tegoż pliku.

0
Rines napisał(a)

Użytkownik wybiera zdjęcie z dysku następnie pisze jakiś tekst i to wszystko (tekst ze zdjęciem) zapisuje do JEDNEGO pliku. Następnie może otworzyc taki plik a na ekranie wyświetla mu się zdjęcie wraz z opisem

W pliku jpg można zapisać dane Exif - tam należy umieścić opis zdjęcia. Najważniejsze, że tak umieszczony opis będzie w stanie odczytać dowolna przeglądarka grafiki nie tylko Twój specjalny program.

0

Tak, jak kolega @[losowa nazwa] napisał, skorzystaj z plików amorficznych, zapisz najpierw opis, później w dalszej części dane obrazu; Dlaczego taka kolejność? Będziesz mógł łatwo wykonać i zapis, i odczyt; Jeśli chciałbyś zapisać najpierw obrazek, później opis też nie ma większego problemu, ale musiałbyś umieć odczytać jego wielkość, co zakładam, że na razie nie umiesz, więc pozostań przy wersji @[losowa nazwa];

Ja ze swojej strony polecę klasę TMemoryStream do odczytu obrazu; Teraz robię program, do którego całą grafikę (czyli m.in. ikony do menu głownego) znajdują się w jedym pliku i odpowiednio w konstruktorach formularzy odczytuję wybrane dla niej ikony; Bardzo przydatna jest ta klasa, dużym plusem jest łatwość obsługi;

Jeśli chodzi o zapis danych do pliku to nie ma o czym dyskutować, poczytaj artykuł o kopiowaniu plików na tym forum, a będziesz wiedział jak odczytywać kolejne bloki danych i zapisywać je do nowego; Niekoniecznie musisz użyć WinAPI, najpierw skoncentruj się nad teorią i praktyką; Poczytaj także o BlockRead i BlockWrite, bo bez tego się raczej nie obejdziesz (choć na pewno można użyć innych metod, ale te są dość proste do zrozumienia);

Jeżeli chodzi o sam opis - @[losowa nazwa] podał pomysł, by zapisać w pierwszym bajcie ilość znaków opisu; Możesz to wykorzystać i dynamicznie przydzielać obszar dla niego, ale nie sądzę, żeby tworzone opisy były aż tak długie, by znacząco wpływały na wagę pliku; Możesz ustalić stałą długość opisu (np. 255 znaków - typ ShortString) i zapisywać opis na sztywno, resztę niewykorzystanych znaków wypełnisz czym chcesz; Jednak myślę, że nie ma potrzeby kombinować i łatwiejszy w implementacji będzie dynamiczny obszar dla opisu; Zrób jak chcesz, możliwości masz kilka, wszystko zależy od tego co dasz radę zrobić;

Kodu Ci nie napiszę, ale jak postarasz się i napiszesz coś, co niekoniecznie będzie w pełni realizować założenia - z chęcią pomogę;


pelsta napisał(a)

W pliku jpg można zapisać dane Exif - tam należy umieścić opis zdjęcia.

To też jest wyjście i to bardzo dobre, ale nie sądzę, żeby autor potrafił na tym etapie drążyć w danych pliku; To oczywiście wiąże się ze znajomością formatu pliku jaki się wykorzystuje w programie; Na to chyba jeszcze przyjdzie czas :]

Poza tym autor nie napisał jakich formatów będzie używał jego program; Jeśli tylko np. jpg to racja, można wykorzystać Exif, ale jeśli nie no to sprawa się dość komplikuje (trochę więcej pracy go czeka);

0

@Rines: wprawdzie nie sprecyzowałeś, ale rozumiem, że koniecznie chcesz zapisywać każdy opis i grafikę w osobnym pliku, jednak jeżeli nie odpowiada Tobie Exif i inne wspominane przez Poprzedników metody, to możesz zapoznać się z kodem programu, który dołaczyłem do tego posta. Przechowuje on grafiki i opisy w jednym pliku spakowanym algorytmem zlib i pozwala te dane odczytać. Może to się Tobie do czegoś przyda. A napisałem to dośyc dawno i na szybko.

0

Dzieki za odpowiedź ;)

Mam dużo czasu na napisanie tego programu więc na pewno coś wykombinuje- jeżeli coś nie będę wiedział to napisze a na razie dzięki ;)

A mam jeszcze jedno pytanie:

Czy da się odczytać z jakiegoś pliku tekstowego nazwę np zdjęcia i potem odczytać to zdjęcie z katalogu i wyświetlić je na ekranie??
Chodzi mi o to że:
Użytkownik podaje nazwę zdjęcia ta nazwa jest zapisywana no pliku *.txt a potem odczytuje ten plik, odczytuje nazwę zdjęcia i wyświetla to zdjęcie albo je kopiuje.

Bo jeżeli dało by się odczytywać ze zmiennej nazwę pliku to było by ok ale właśnie ie jestem pewien czy da się :/

0

Oczywiście, że się da. I najprościej do tego użyć plików INI, opisanych tutaj: Pliki INI - natomiast do sprawdzenia przed wczytaniem czy dany plik istnieje używaj funkcji FileExists.

0

Aha a do tego rodzaju plików da się także zapisać krótki opis?? Który potem zostanie wyświetlony razem ze zdjęciem ??

0

Oczywiście. Plik typu INI może się składać z wielu tak zwanych sekcji i wartości. Na przykład:

[PictureFileData]
FileName=D:\something.jpg
Description=Cool photo :)

Więcej masz w artykule. Najlepiej nie pytaj co chwilę, tylko pokombinuj też samodzielnie :) A nazewnictwo podałem angielskie, bo zawsze staram się w programach elementy kodu nazywać według tej konwencji, nawet jak program później komunikuje się z użytkownikiem po polsku. Po prostu jeżeli przyszłościowo pokazałbyś swój kod osobie nie będącej Polakiem będzie jej łatwiej ogarnąc taki kod z nazewnictwem w języku angielskim.

0

Dzieki za odpowiedź teraz przyszła pora na powolne kombinowanie i pisanie ;)

0

@olesio, powinieneś wcześniej napisać, że pakowanie opisu do pliku txt nie jest najleprzym pomysłem, ponieważ taki sposób jest w ogóle nieprzenośny... Dane nie zostają wpisane do pliku z obrazem, więc po skopiowaniu czy choćby przeniesieniu pliku już dupa zbita...

Z takimi rzeczmi będzie więcej zabawy niż to warte; Oczywiście oba sposoby mają wady i zalety, ale według mnie lepszym sposobem będzie zapisanie w jednym pliku zarówno opisu, jak i grafiki; Wiadome, że tego pliku nie otworzy inny program graficzny (chyba, że opis umieści się po danych grafiki), ale o to chyba chodzi, żeby tworzone pliki były zawsze wykorzystywane w programie autora wątku;

Zaletą jest jednak to, że wcale dużo kodu nie trzeba będzie wklepywać by zapisać jak i otworzyć taki plik w programie;

0

Wiem, dlatego podesłałem przykład kodu w archiwum prosta_baza.rar. Ten program zapisuje wszystko w jednym pliku pakowanym alogytmem ZLib wraz z opisami, ale nie problem to przerobić na program który zapisuje grafikę i dodatkowe dane w osobnych plikach oraz je odczytuje i wyświetla obrazek. Wystarczy tylko chwilę poanalizować kod i go przerobić do swoich potrzeb, ale do tego trzeba właśnie chęci, nie zadawania nowych pytań skoro uważam, ze mój kod jest w miarę przejrzysty i samo wyjaśniający się, a przynajmniej tak starałem się to pisać mimo że robiłem to jak chyba wspomniałem na szybko.

1 użytkowników online, w tym zalogowanych: 0, gości: 1