Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Clipboard > Png
#1
Merhaba arkadaşlar, bir word dökümanının içinde bulunan PNG formatındaki resmi Ctrl+C ile clipboard'a yolluyorum, daha sonra uygulamam içinden TPicture.Assign(Clipboard) ile alıyorum ama bu şekilde alınca transparency kayboluyor. 

Bunun için bir çözüm önerisi ya da yol önerebilir misiniz ?

Not: Harici kütüphane kullanmak istemiyorum.

Sevgiler
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#2
Merhaba hocam,

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol Windows API'si ile

RegisterClipboardFormat('PNG') 
 
veya

Delphi XE ve daha üst sürümleri için;
Clipboard.Assign(Image1.Picture.Graphic);

yöntemi ile çözüme ulaşıldığını belirtiyorlar. Kaynak: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#3
(20-12-2016, Saat: 15:36)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba hocam,

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol Windows API'si ile

RegisterClipboardFormat('PNG') 
 
veya

Delphi XE ve daha üst sürümleri için;
Clipboard.Assign(Image1.Picture.Graphic);

yöntemi ile çözüme ulaşıldığını belirtiyorlar. Kaynak: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Deneyebilir misiniz küçük bir uygulamada ? Kafam iyice ambele oldu, bir çok yöntem denedim ama sonuç pek olumlu değil. Bitmap create edip TrnasparentColor ataması yapıyorum ama o da saçma sapan sonuçlara neden oluyor. Aslında, Word dökümanında iken ilgili resme sağ tıklatıp Save as Picture dedirtebilsem de olur. Amacım word dökümanının içindeki o resmi bir şekilde transparency'si ile elde edebilmek.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#4
(20-12-2016, Saat: 15:56)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(20-12-2016, Saat: 15:36)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba hocam,

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol Windows API'si ile

RegisterClipboardFormat('PNG') 
 
veya

Delphi XE ve daha üst sürümleri için;
Clipboard.Assign(Image1.Picture.Graphic);

yöntemi ile çözüme ulaşıldığını belirtiyorlar. Kaynak: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Deneyebilir misiniz küçük bir uygulamada ? Kafam iyice ambele oldu, bir çok yöntem denedim ama sonuç pek olumlu değil. Bitmap create edip TrnasparentColor ataması yapıyorum ama o da saçma sapan sonuçlara neden oluyor. Aslında, Word dökümanında iken ilgili resme sağ tıklatıp Save as Picture dedirtebilsem de olur. Amacım word dökümanının içindeki o resmi bir şekilde transparency'si ile elde edebilmek.

Her iki durumda da transparan olmuyor. Resmin Background'u siyah kalıyor.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#5
Evet maalesef durum o ahvalde. Ben TransparentColor'una clWhite vererek ve Transparent := true ataması yaparak kısmi bir transparency elde ediyorum ama şık bir yöntem değil.

Arayışlar ve denemelerim devam ediyor, yol gösterebilecek arkadaşlar olur ise sevinirim.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#6
Biraz daha zahmetli de olsa bir çözüm var: Eğer Word dokümanı docx uzantılı ise dosya uzantısını zip yapıp içeriğine bakarsanız resimlerin ayrı bir klasör içerisinde olduğunu görürsünüz. Yani biz Delphi'de dosya uzantısını zip yapıp, dosyayı unzipleyip içinden resimleri çekebiliriz.
There's no place like 127.0.0.1
WWW
Cevapla
#7
O ihtimalide göz önünde bulundurmuştum ama şık bulmadığım için dikkate almamaya karar vermiştim. Dün gece sinirlendim Delphi'nin PNG ile bu şekilde çalışmamasına, bende Clipboard'u bir stream olarak okuyup kendi PNG datasını kendisi yoğuran bir kod yazdım. Şu an bahse konu sorun bertaraf edildi benim açımdan.

Ama Embarcadero'nun bu tarz hususlara daha ağırlık vermesini arzulardım. Mükemmel bir nesne hiyerarşisi ve alt yapı var; ama ufak tefek eksiklikler can sıkıyor çoğu zaman. Halledip geçiyoruz ama yeniliklerin bir müddet gelmemesi onun yerine mevcut kütüphanelerdeki hata ve eksikliklerin giderilmesini tercih ederdim ben.

İhtiyacı olabilecek arkadaşların benim gibi sıkıntı yaşamaması adına yazdığım kodu beğeninize sunuyorum:

function GetPNGImageFromClipboard : TGraphic;
var
 APngRegisterFormat  : Word;
 AClipboardData      : NativeUInt;
 ADataPointer        : PByte;
 ADataSize           : NativeUInt;
 APureData           : TBytes;
 ADataStream         : TBytesStream;
begin
 Result := nil;

 APngRegisterFormat := RegisterClipboardFormat('PNG');

 if APngRegisterFormat = 0 then
   Exit;

 if OpenClipboard(0) then
 begin
   try
     if IsClipboardFormatAvailable(APngRegisterFormat) then
     begin
       AClipboardData := GetClipboardData( APngRegisterFormat );

       if AClipboardData <> 0 then
       begin
         ADataPointer := GlobalLock( AClipboardData );

         if Assigned(ADataPointer) then
         begin
           try
             ADataSize := GlobalSize( AClipboardData );

             if ADataSize <> 0 then
             begin
               SetLength(APureData, ADataSize);
               Move(ADataPointer^, APureData[0], ADataSize);

               ADataStream := TBytesStream.Create(APureData);

               try
                 ADataStream.Position := 0;

                 Result := TPngImage.Create;

                 Result.LoadFromStream(ADataStream);
               finally
                 FreeAndNil(ADataStream);
                 APureData := nil;
               end; // try..finally
             end; // if ADataSize <> 0 then
           finally
             GlobalUnlock( AClipboardData );
           end; // try..finally
         end; // if Assigned(ADataPointer) then
       end; // if AClipboardData <> 0 then
     end; // if IsClipboardFormatAvailable(APngRegisterFormat) then
   finally
     CloseClipboard;
   end; // try..finally
 end; // if OpenClipboard(0) then
end;
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#8
Merhaba hocam, 
Hemen test edeyim dedim.  Smile Lazım olur.
Fakat IsClipboardFormatAvailable(APngRegisterFormat) metodu false dönüyor ve işlem gerçekleşmiyor.


implementation

Uses PngImage;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 function GetPNGImageFromClipboard: TGraphic;
 var
   APngRegisterFormat: Word;
   AClipboardData: NativeUInt;
   ADataPointer: PByte;
   ADataSize: NativeUInt;
   APureData: TBytes;
   ADataStream: TBytesStream;
 begin
   Result := nil;

   APngRegisterFormat := RegisterClipboardFormat('PNG');

   if APngRegisterFormat = 0 then
     Exit;

   if OpenClipboard(0) then
   begin
     try
       if IsClipboardFormatAvailable(APngRegisterFormat) then
       begin
         AClipboardData := GetClipboardData(APngRegisterFormat);

         if AClipboardData <> 0 then
         begin
           ADataPointer := GlobalLock(AClipboardData);

           if Assigned(ADataPointer) then
           begin
             try
               ADataSize := GlobalSize(AClipboardData);

               if ADataSize <> 0 then
               begin
                 SetLength(APureData, ADataSize);
                 Move(ADataPointer^, APureData[0], ADataSize);

                 ADataStream := TBytesStream.Create(APureData);

                 try
                   ADataStream.Position := 0;

                   Result := TPngImage.Create;

                   Result.LoadFromStream(ADataStream);
                 finally
                   FreeAndNil(ADataStream);
                   APureData := nil;
                 end; // try..finally
               end; // if ADataSize <> 0 then
             finally
               GlobalUnlock(AClipboardData);
             end; // try..finally
           end; // if Assigned(ADataPointer) then
         end; // if AClipboardData <> 0 then
       end; // if IsClipboardFormatAvailable(APngRegisterFormat) then
     finally
       CloseClipboard;
     end; // try..finally
   end; // if OpenClipboard(0) then
 end;

begin
 Image1.Picture.Graphic.Assign(GetPNGImageFromClipboard);
end;

2py4a44.jpg
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#9
Enteresan, sanki clipboard'a PNG resim atmamışsınız diyeceğim. Ayrıca nerede AV hatası alıyorsunuz ? Nerede AV aldığınızı gördüm. Geri dönen değerin Assigned ile kontrol edilmesi gerekli. Ayrıca bir TPicture içinde resim yok ise henüz Graphic classı nil durumdadır. Dolayısı ile Image1.Picture.Assign kullanmanız gerekir.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#10
(21-12-2016, Saat: 11:28)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlEnteresan, sanki clipboard'a PNG resim atmamışsınız diyeceğim. Ayrıca nerede AV hatası alıyorsunuz ? Nerede AV aldığınızı gördüm. Geri dönen değerin Assigned ile kontrol edilmesi gerekli. Ayrıca bir TPicture içinde resim yok ise henüz Graphic classı nil durumdadır. Dolayısı ile Image1.Picture.Assign kullanmanız gerekir.

Image1.Picture.Assign(GetPNGImageFromClipboard);

şeklinde kullanınca da aynı oluyor.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi