Delphi 2006: При назначении во время выполнения PNG для TImage теряется альфа-прозрачность

Delphi 2006 ' s TImage не совсем поддерживает PNG. Чтобы в моих формах были изображения с альфа-прозрачностью, я должен загружать их во время выполнения. Я могу загрузить их во время разработки, но они не сохраняются, я думаю, потому что PNG не сохраняются в файле DFM. Я уверен, что в последней версии Delphi все это нереально, но я не могу обновить прямо сейчас.

В любом случае, я загружал их во время выполнения с помощью:

Image1.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ;

Компонент PNGImageCollection содержит все мои PNG различных размеров (они создаются и загружаются во время разработки), и я назначаю их соответствующим TImages в событии FormCreate.

Это работало нормально, пока у меня не возникла проблема, когда я пытался повторно использовать один из этих изображения в другом месте после того, как они были использованы в форме. Я обнаружил, что в результате присвоения TPicture было установлено пустое изображение в результате Assign. Это происходило в подпрограмме TPicture.ForceType, которая AFAICT проверяет тип FGraphic, и, если это не тот тип, который требуется, освобождает FGraphic и создает новый экземпляр запрошенного типа.

Хорошо. Итак, немного поцарапав, я вижу, что, возможно, мне действительно стоит это сделать:

Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ; 

Это сработало, потому что Assign не затушил изображение, но теперь изображение отображается с полупрозрачными битами как непрозрачное , например:

TImage when assigned with Image1.Picture.Bitmap.Assign

вместо:

TImage when assigned with Image1.Picture.Assign

Как я могу заставить это изображение правильно отображать альфа-прозрачные биты? (и дополнительный вопрос: Правильный ли способ сделать Image1.Picture.Bitmap.Assign?)

Вот код более подробно:

В коде, где у меня возникла проблема с «повторным использованием» TImage , последовательность была:
и если это не желаемый тип, он освобождает FGraphic и создает новый экземпляр запрошенного типа.

Хорошо. Итак, немного поцарапав, я вижу, что, возможно, мне действительно стоит это сделать:

Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ; 

Это сработало, потому что Assign не затирал изображение, но теперь изображение отображается с полупрозрачными битами как непрозрачное , например:

TImage when assigned with Image1.Picture.Bitmap.Assign

вместо:

TImage when assigned with Image1.Picture.Assign

Как я могу заставить это изображение правильно отображать альфа-прозрачные биты? (и дополнительный вопрос: Правильный ли способ сделать Image1.Picture.Bitmap.Assign?)

Вот код более подробно:

В коде, где у меня возникла проблема с «повторным использованием» TImage , последовательность была:
и если это не желаемый тип, он освобождает FGraphic и создает новый экземпляр запрошенного типа.

Хорошо. Итак, немного поцарапав, я вижу, что, возможно, мне действительно стоит это сделать:

Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ; 

Это сработало, потому что Assign не затушил изображение, но теперь изображение отображается с полупрозрачными битами как непрозрачное , например:

TImage when assigned with Image1.Picture.Bitmap.Assign

вместо:

TImage when assigned with Image1.Picture.Assign

Как я могу заставить это изображение правильно отображать альфа-прозрачные биты? (и дополнительный вопрос: Правильный ли способ сделать Image1.Picture.Bitmap.Assign?)

Вот код более подробно:

В коде, где у меня возникла проблема с «повторным использованием» TImage , последовательность была:
Я вижу, что, возможно, мне действительно стоит сделать это:

Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ; 

Это сработало, потому что Assign не сбил изображение, но теперь изображение отображается с полупрозрачными битами как непрозрачное, то есть:

TImage when assigned with Image1.Picture.Bitmap.Assign

вместо :

TImage when assigned with Image1.Picture.Assign

Как я могу заставить это изображение правильно отображать альфа-прозрачные биты? (и дополнительный вопрос: Правильный ли способ сделать Image1.Picture.Bitmap.Assign?)

Вот код более подробно:

В коде, где у меня возникла проблема с «повторным использованием» TImage , последовательность была:
Я вижу, что, возможно, мне действительно стоит сделать это:

Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ; 

Это сработало, потому что Assign не затушил изображение, но теперь изображение отображается с полупрозрачными битами как непрозрачное, то есть:

TImage when assigned with Image1.Picture.Bitmap.Assign

вместо :

TImage when assigned with Image1.Picture.Assign

Как я могу заставить это изображение правильно отображать альфа-прозрачные биты? (и дополнительный вопрос: Правильный ли способ сделать Image1.Picture.Bitmap.Assign?)

Вот код более подробно:

В коде, где у меня возникла проблема с «повторным использованием» TImage , последовательность была:
При создании формы:

LogoImage.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ; 

(PNGIMage - это логотип компании, LogoImage1 находится в главной форме).

При печати заголовка отчета:

procedure PrintLogo (Report : TBaseReport) ;

var
    X1, Y1, LogoHeightMM    : Double ;

begin
with Report do
    begin
    LogoHeightMM  := CalcGraphicHeight (LogoWidthMM, MainForm.LogoImage.Picture.Graphic) ;
    X1            := PageWidth - MarginRight - LogoWidthMM ;
    Y1            := SectionBottom - LogoHeightMM ;
    PrintBitmapRect (X1, Y1, X1 + LogoWidthMM, Y1 + LogoHeightMM, MainForm.LogoImage.Picture.Bitmap) ;
    end ;
end ;

При первом вызове процедуры печати логотипа она выполняется без ошибок, но LogoImage .Picture остается очищенным после вызова PrintBitmapRect. При следующем вызове подпрограммы печати заголовка вызов CalcGraphicHeight завершится ошибкой, поскольку ширина и высота изображения равны нулю.

Изменение Picture.Assign на Picture.Bitmap.Assign исправляет RTE в подпрограмме печати заголовка, но когда я трансплантировал то же самое «исправление» на другие статические изображения, назначенные из PNG (например, шестеренки выше), я потерял канал aplha.

5
задан rossmcm 21 March 2011 в 05:22
поделиться