Конференция "Игры" » PNG -> BMP [Delphi, Windows]
 
  • ХХХХХ (01.03.13 19:55) [0]
    Вылетает с AV на помеченной строке:


    function CreateBmp32FromPng(Png: TPngObject): TBitmap;
    type
     PRGBQuadArray   = ^TRGBQuadArray;
     TRGBQuadArray   =  array [0..1] of TRGBQuad;

     PRGBTripleArray = ^TRGBTripleArray;
     TRGBTripleArray =  array [0..1] of TRGBTriple;
    var
     X, Y:      LongInt;
     Line:      PRGBQuadArray;
     LineRGB:   PRGBTripleArray;
     LineAlpha: PByteArray;
    begin
     Result            := TBitmap.Create;
     Result.Width      := Png.Width;
     Result.Height     := Png.Height;
     Result.PixelFormat:= pf32bit;

     For Y:= 0 to (Result.Height - 1) do
     begin
       Line     := Result.Scanline[Y];
       LineRGB  := Png.Scanline[Y];
       LineAlpha:= Png.AlphaScanline[y];
       For X:= 0 to (Result.Width - 1) do
       begin
         Line^[X].rgbReserved:= LineAlpha^[X];               // <---
         Line^[X].rgbRed     := LineRGB^[X].rgbtRed;
         Line^[X].rgbGreen   := LineRGB^[X].rgbtGreen;
         Line^[X].rgbBlue    := LineRGB^[X].rgbtBlue;
       end;
     end;
    end;




    Некоторые PNG нормально загружает, некоторые выдают эту ошибку.
    Что не правильно?
  • Sapersky (01.03.13 20:02) [1]
    Очевидно, вылетает на тех, у которых нет альфы (< 32 bpp). Проверяй LineAlpha на nil или PixelFormat у TPngObject.
  • ХХХХХ (01.03.13 20:13) [2]
    И заполнить Line^[X].rgbReserved нулями?
  • Sapersky (01.03.13 20:20) [3]
    Если потом собираешься выводить битмапы с полупрозрачностью, не разбираясь, была альфа у исходного png или нет, то заполнять надо 255 (непрозрачный).
    Иначе без разницы, можно нулями, можно оставить как есть (скорее всего те же нули там и будут).
  • ХХХХХ (01.03.13 20:32) [4]
    Спасибо.


    > (скорее всего те же нули там и будут).


    Проверил.
    У всех 255.
 
Конференция "Игры" » PNG -> BMP [Delphi, Windows]
Есть новые Нет новых   [134427   +35][b:0][p:0.001]