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 не затушил изображение, но теперь изображение отображается с полупрозрачными битами как непрозрачное , например:
вместо:
Как я могу заставить это изображение правильно отображать альфа-прозрачные биты? (и дополнительный вопрос: Правильный ли способ сделать Image1.Picture.Bitmap.Assign?)
Вот код более подробно:
В коде, где у меня возникла проблема с «повторным использованием» TImage , последовательность была:
и если это не желаемый тип, он освобождает FGraphic и создает новый экземпляр запрошенного типа.
Хорошо. Итак, немного поцарапав, я вижу, что, возможно, мне действительно стоит это сделать:
Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ;
Это сработало, потому что Assign не затирал изображение, но теперь изображение отображается с полупрозрачными битами как непрозрачное , например:
вместо:
Как я могу заставить это изображение правильно отображать альфа-прозрачные биты? (и дополнительный вопрос: Правильный ли способ сделать Image1.Picture.Bitmap.Assign?)
Вот код более подробно:
В коде, где у меня возникла проблема с «повторным использованием» TImage , последовательность была:
и если это не желаемый тип, он освобождает FGraphic и создает новый экземпляр запрошенного типа.
Хорошо. Итак, немного поцарапав, я вижу, что, возможно, мне действительно стоит это сделать:
Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ;
Это сработало, потому что Assign не затушил изображение, но теперь изображение отображается с полупрозрачными битами как непрозрачное , например:
вместо:
Как я могу заставить это изображение правильно отображать альфа-прозрачные биты? (и дополнительный вопрос: Правильный ли способ сделать Image1.Picture.Bitmap.Assign?)
Вот код более подробно:
В коде, где у меня возникла проблема с «повторным использованием» TImage , последовательность была:
Я вижу, что, возможно, мне действительно стоит сделать это:
Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ;
Это сработало, потому что Assign не сбил изображение, но теперь изображение отображается с полупрозрачными битами как непрозрачное, то есть:
вместо :
Как я могу заставить это изображение правильно отображать альфа-прозрачные биты? (и дополнительный вопрос: Правильный ли способ сделать Image1.Picture.Bitmap.Assign?)
Вот код более подробно:
В коде, где у меня возникла проблема с «повторным использованием» TImage , последовательность была:
Я вижу, что, возможно, мне действительно стоит сделать это:
Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ;
Это сработало, потому что 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.