[Çözüldü] "Tif" dosya başlığı okuyarak boyut öğrenme

Başlatan Jey@Nfer, 07 Haziran 2013 - 07:46:55

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

Jey@Nfer

merhaba arkadaşlar,
elimdeki tiff dosyalarının piksel cinsinden genişlik ve yüksekliklerini  ( 600 x 730 gibi ) nasıl öğrenebilirim?
bunun için birkaç kod yazdım ama başarılı olamadım bi yardımcı olursanız çok sevinirim
Yalnız bir ayrıntı olarak bu kodu windows sistemlerde de kullanacağım için sistem komutları değil de yerleşik fonksiyonları kullanmak lazım.
ben c ile yapmaya çalıştım ancak siz c++ ile yaparsanız da olur.
şimdiden teşekkürler


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 07 Haziran 2013 - 10:45:36

Arkadaşlar aşağı yukarı ne yapmam gerektiğini çözdüm :

( aşağıdaki kod bmp dosyaları için ;
aynı klasörde yer alan "dosya1.bmp" , bmp dosyasının boyutunu sorunsuz veriyor.)


#include "stdio.h"
#include "stdlib.h"

main()
{
FILE* f = fopen("dosya1.bmp", "rb");
unsigned char info[54]; //burasını tiff dosyasının başlık tipleri neyse o yapmalıyım
    fread(info, sizeof(unsigned char), 54, f); // buradaki 54'u değiştirip tiff dosyalarına göre, boyut bilgisini içine alacak şekilde büyütmeliyim
   
    int width = *(int*)&info[18]; //tiff dosyalarının genişlik bilgisi nerdeyse onu bulmalıyım
    int height = *(int*)&info[22]; // yükseklik bilgisinin olduğu gözü bulmalıyım
   
printf("genislik : %d \n", width);
printf("yukseklik :%d \n", heigh);

fclose(f);
}



şimdi benim bulmam gereken "tiff" dosyaları için başlık dosyaları ne boyutta onu öğrenmeliyim.
zaten ne yapmam gerektiğini kodda açıkladım arkadaşlar ,
şuradan bakarak bir şeyler çıkarabilecek olan olursa artık :
http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf
(sanırım 13-20. sayfalar arası işimi görüyor ama bi türlü çözüme ulaşamdım)


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 07 Haziran 2013 - 11:27:02

şunlar işime yarıycak :
http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html
Hırs , azim , tevekkül ...

www.mehmetvahit.net


Jey@Nfer

#2
Arkadaşlar tif dosyalarının mantığı daha farklı oluyormuş. Belirli başlık değerleri var bunları bulup alakalı olan değerlere ulaşmak gerekiyor.
Daha detaylı bilgi için : http://paulbourke.net/dataformats/tiff/

Daha sonra bu başlık dosyalarını bulup okumak için bir kod yazdım :

#include <stdio.h>
#include <stdlib.h>

int main()
{
   FILE *fptr;
   int n = 0;
   unsigned short int c,bul1 = 0x0100,bul2 = 0x0103;



        if ((fptr = fopen("268.tif","r")) == NULL) {
                fprintf(stderr,"Dosya acilamadi \"%s\"\n","tifgit.tif" );
                exit(-1);
        }

   while (fread(&c,2,1,fptr) == 1)
   {
                n++;
                printf("%d - %d \n",n, c);
      if (c >= bul1 && c <= bul2)
        printf(" %d basligi basligi %d. kelimede \n",c,n);
                if (n > 100)
                        break;
   }
   fclose(fptr);

   exit(0);
}


ancak sonra işlerin bununla da bitmediğini farkettim. "Byte order" denen bir şey durum var. "Intel" veya "Motorola" byte dizilişleri farklı olabiliyor , üstelik sadece bu da değil , tif dosyalarının daha envai çeşit kodlama standardı var. Yani temel olarak olay bu "başlık dosyasını bulup ilgili değeri çek" , ama hangi başlık dosyası nerede ve nasıl kodlanmış olduğunun sabit bir standardı yok. Bunun için her standartdı kapsayacak biçimde her standart için ayrı bir arama literatürü uygulamak gerekiyor. Bunun yerine "@doganaydin"in da belirttiği gibi "libtiff" kütüphanesini kullanmak daha mantıklı.

Bu sorunu "tiffio.h" kütüphane dosyasıyla şöyle çözdüm :


#include <stdio.h>
#include "tiffio.h"
#include <string.h>
#include <dirent.h>
int main(void)
{
    DIR *dp;
    struct dirent *ep;
    uint32 w, h;
    float xdpi,ydpi;

    dp = opendir ("./");
    char file_name[30];
    char last[30];
    if (dp != NULL)
    {
        while (ep = readdir (dp))
        {
            if( ( strstr(ep->d_name, ".tif") != NULL ) || ( strstr(ep->d_name, ".TIF") != NULL ) )
            {
                TIFF* tif = TIFFOpen(ep->d_name, "r");
                TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
                TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
                TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xdpi);
                TIFFGetField(tif, TIFFTAG_YRESOLUTION, &ydpi);

                printf("%s --> %d x %d | %.f - %.f \n",ep->d_name, w, h, xdpi,ydpi);

                strncpy ( file_name, ep->d_name, ep->d_namlen-4 );
                file_name[ep->d_namlen-4]='\0';

                sprintf(last,"%s (%.f x %.f).tif", file_name, (float) ((w/xdpi)*2.54) , (float) ((h/ydpi)*2.54) ); // pixel to cm

                printf("      |__ %s\n\n",last);

                TIFFClose(tif);

                rename(ep->d_name, last);
            }
        }
        (void) closedir (dp);
    }
    else
        perror ("Directory can not open!");
return 0;
}


yukardaki kodun yaptığı iş şu:
  * açtığınız dizin içindeki tif dosyalarını bulur
  * pixel cinsinden boyut bilgilerini alır
  * bu piksel boyutlarını dpi bilgisini kullanarak cm cinsinden boyut elde eder
  * ve dosyaları yeniden adlandırır

kodu ingilizce yazdım çünkü :
http://stackoverflow.com/questions/16980088/how-to-read-tiff-file-headers-in-c
işinize yarar umarım..
Hırs , azim , tevekkül ...

www.mehmetvahit.net