Yorumları: 1.460
Konuları: 80
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 11.868
Üstad
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...
Yorumları: 1.460
Konuları: 80
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 11.868
Üstad
(20-12-2016, Saat: 15:36)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Merhaba hocam,
Registered Clipboard Formats 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: stackoverflow.com
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...
Yorumları: 1.460
Konuları: 80
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 11.868
Üstad
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...
Yorumları: 1.571
Konuları: 88
Kayıt Tarihi: 09-08-2016
Rep Puanı: 13.829
Üstad
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
Yorumları: 1.460
Konuları: 80
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 11.868
Üstad
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...
Yorumları: 1.460
Konuları: 80
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 11.868
Üstad
21-12-2016, Saat: 11:28
(Son Düzenleme: 21-12-2016, Saat: 11:39, Düzenleyen: Tuğrul HELVACI.)
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...