2016-03-20 38 views
1

"Herhangi bir" görüntü türünü (gif, jpg, bmp, png, vb.) Diskten yükleyen ve bir bitmap döndüren genel amaçlı bir işlev oluşturmak istiyorum. Exit işlevselliği TBitmap'e nasıl eklenir?

function LoadGraph(FileName: string): TBitmap;  {pseudocode} 
begin 
    if FileIsJpeg then 
    jpeg.LoadFromFile; 
    Bitmap.Exif.Assign(Jpeg.Exif); 
end; 

şey

Ben girdi tipi Jpeg olduğunda Exif verilerine erişimi olması gerekir olmasıdır.

E2599 Field definition not allowed in helper type

: Bu derleme hatası olsun

TYPE 
    TBitmapHelper = class helper for TBitmap 
    public 
     FExifData: TExif; 
    end; 

Ancak, Delphi derleyicisi (? Henüz) bu yeteneği yok görünüyor: Yani, bir sınıf böyle yardımcı yaratmak istedik

Bunu nasıl başarabilirim?

+0

Yapabilirim: function LoadGraph (FileName: string; out Exif: TExif): TBitmap, sınıf yardımcısı kadar zarif değil. Sağ? – Ampere

+0

Hayır, yardımcılar veri üyeleri ekleyemez, yalnızca yöntemleri ve özellikleri. Ancak bir veri üyesi çok fazla kullanılmayacaktı. Veriler ne zaman yazılacak? Dosyayı nasıl okursun? –

+0

Yani, benim görüşüme göre, bu işlevi 'TBitmap''e eklemeyi denemiyorsunuz, sorunu çözmek için başka bir yol buluyorsunuz. –

cevap

1

çeşitli görüntü formatları ile çalışmak üzere tasarlanmıştır Delphi grafik nesnelerin oldukça karmaşık bir hiyerarşi var: TGraphic Eğer dosyadan yüklemek dosya ve tuval üzerinde çizmek için kaydedebilirsiniz bazı görüntü için soyut sınıftır.

Picture.LoadFromFile(Filename); 

ve doğru grafik sınıf bakmak oluşturun ve görüntü yükleyecektir: TPicture kodu sadece bir satır yazmasına olanak tanır TGraphic için kapsayıcıdır.

Sizin için çözümlerden biri, TBitmap yerine TPicture kullanmak olacaktır. TBitmap ve onun torunları için TPicture Bitmap özelliği içerecektir, diğerleri için Tuval üzerine çizebilir veya TBitmap'inize Picture.Graphic atayabilirsiniz (TJPEGImage, TPNGImage için çalışır, ancak yine de TIcon ile başarısız olur).

Eğer çok büyükse, örneğin, ekranda sadece görüntü göstermek değil, bir şekilde değiştirmek ve aslında her zaman nasıl temsil edildiğini düşünmek gerekmez, sadece yardımcısı değil, aynı zamanda TBitmap'den alt öğe oluşturmanızı öneririm Oldukça mümkün, böyle bir nesneyi TBitmap'in olduğu yerde programın her yerine iletebilirsiniz, ancak şimdi yeni alanlarla genişletebilirsiniz. ICC profilleri yeteneği eklemek için benzer bir şey yapacağım (BitmapHeaderV5'te desteklenir).

+1

JPEG/PNG'nin yanı sıra, LoadGraph fonksiyonum diğer formatları da destekliyor ... Bu yüzden TPicture benim için çalışmaz. – Ampere

+0

@SolarWind GraphicEx kitaplığında olduğu gibi başka biçimler eklemek için de TPicture.RegisterFileFormat'ı kullanabilirsiniz. –

+1

Üzgünüz, ancak yine de exif veri yapısının bitmap (veya resim) nesnesine nasıl eklenebileceğini göstermiyorsunuz. – Ampere