Timage Transparencies на ноутбуках в Delphi 7

ЧТО Я ПЫТАЮСЬ СДЕЛАТЬ

Я пытаюсь нарисовать несколько графиков в Timage. Эти рисунки, которые я рисую, состоят из упорядоченных слоев с Foodfills и линиями. Я использую несколько буферов для обеспечения упорядочения и двойной буферизации.

ЧТО Я ДЕЛАТЬ

    procedure DrawScene();
var
  ObjLength,LineLength,Filllength,Obj,lin,angle,i:integer;
  Npoints : array[0..1] of Tpoint;
  Objmap:TBitmap;
  wholemap:TBitmap;

begin
  wholemap := TBitmap.Create;
  wholemap.Width:=area;
  wholemap.height:=area;

  ObjLength:=length(Objects);
  for Obj:=0 to (ObjLength-1) do
  if objects[Obj].Visible then
  begin
    // create object bitmap

    if Objects[obj].Tag='FBOX' then
      begin

      Objmap := TBitmap.Create;
      Objmap.Width:=area;
      Objmap.height:=area;
      Objmap.Transparent:=true;

      Objmap.Canvas.Rectangle((objects[obj].Boundleft-4)+objects[obj].Position.x,area-((objects[obj].boundtop+4)+objects[obj].Position.y),(objects[obj].boundright+4)+objects[obj].Position.x,area-((objects[obj].boundbottom-4)+objects[obj].Position.y));
      end;
    //draw object
    LineLength:=length(objects[Obj].Lines)-1;
    angle:=objects[Obj].Rotation;
    for lin:=0 to (LineLength) do
    begin
      for i:=0 to 1 do
      begin
        Npoints[i] := PointAddition(RotatePoint(objects[obj].Lines[lin].Point[i],angle),objects[obj].Position,false);
      end;
      Objmap:=DrawLine(Npoints[0].x,Npoints[0].y,Npoints[1].x,Npoints[1].y,objects[obj].Lines[lin].Color,Objmap);
    end;


    Filllength:=length(objects[Obj].Fills)-1;
    for i:=0 to Filllength do
      begin
        Npoints[0]:=PointAddition(RotatePoint(objects[Obj].Fills[i].Point,objects[Obj].Rotation),objects[Obj].Position,false);
        Objmap:=fillpoint( Npoints[0].x, Npoints[0].y,objects[Obj].Fills[i].color,Objmap);
      end;

      //write object to step frame
      wholemap.Canvas.Draw(0,0,Objmap);
      Objmap.Free;


  end;
   // write step frame to Visible Canvas
   mainwindow.bufferim.Canvas.Draw(0,0,wholemap);
   mainwindow.RobotArea.Picture.Graphic:=mainwindow.bufferim.Picture.Graphic;


   wholemap.Free;

end;

ЧТО Я ОЖИДАЮ

Я ожидаю увидеть, что каждый объект изображения наложен один на другой, причем каждый слой изображения будет полным изображением для этого слоя. В моем примере это робот с флагом за ним. сначала рисуется флаг, а затем робот.

ЧТО Я ПОЛУЧАЮ (на ПК)

на компьютере я получаю то, что ожидаю, и все кажется правильным.

ЧТО Я ПОЛУЧАЮ (на ноутбуке)

Почти на каждом ноутбуке и некоторых компьютерах я вижу только робота. Я добавил несколько статей, чтобы увидеть, рисует ли он флаг, и он это делает. игра может даже правильно взаимодействовать с флагом. Дальнейшее расследование показало мне, что это показывало только последнее изображение, нарисованное моей "сценой прорисовки", и когда изображения были нарисованы непосредственно на весь холст, все появлялось (это не может быть сделано из-за перекрывающихся слоев заливки)

ЧТО Я ДУМАЮ, ПРОИСХОДИТ

Итак, я пришел к выводу, что свойство Timage.transparent для Timage не работает или вычисляется по-другому на некоторых машинах ..

Я сделал тест, чтобы доказать это, и сделал холст красным. затем на этом холсте я нарисовал 0,0 i Timage со свойством transparent = true с одной точкой посередине на красном холсте. Результатом был белый холст с точкой посередине.

Я предполагаю, и результаты показывают, что машины с очень простыми графическими драйверами, похоже, рассматривают нулевой или прозрачный как белый, тогда как более мощные машины, кажется, рассматривают нулевой или прозрачный как прозрачный.

это похоже на провал из-за того, что свойство Timage.Transparent было истинным.

РЕДАКТИРОВАТЬ: ОБНОВЛЕНИЕ !!! Похоже, что на видеокартах ATI, если цвет «нулевой», то он интерпретируется в формате PF24bit и, следовательно, без альфа-канала и без прозрачности.

на картах Nvidia он принимает его как PF32bit и рассматривает null как прозрачный.

очевидный способ обойти это - установить для типа растрового изображения значение PF32bit, но это по-прежнему не работает. Затем я предположил, что, возможно, этого недостаточно, и я должен убедиться, что фон установлен на прозрачный, а не оставлен равным нулю ... но нет инструментов (которые я вижу) внутри Timage для установки цвета с альфа-каналом. для всех функций рисования холста требуется Tcolor, который является 24-битным RGB, и только TcolorRef с 32-битным RGBA подойдет .... есть ли способ рисования с альфа-0?

ЧТО, Я ДУМАЮ, НУЖНО ЗНАТЬ

Как заставить свойство Transparent работать на всех машинах, или способ заставить ноутбуки не вставлять прозрачные как белые, Или способ добиться того же результата.

У кого-нибудь есть решения или идеи?


person Arthur    schedule 16.07.2010    source источник
comment
Независимо от того, ноутбук это или компьютер, не должно иметь значения как таковое, но разрешение экрана и особенно глубина цвета, вероятно, важны. Можете ли вы проверить эти вещи хотя бы на двух машинах, одна из которых работает, а другая нет?   -  person Pekka    schedule 16.07.2010
comment
Другая возможная проблема: экран вашего ноутбука может не отображать ваши цвета (пример: очень светлые оттенки всех цветов), и вам кажется, что прозрачность не работает, хотя на самом деле она работает, но вы не видите Это. То же самое происходит с большинством проекторов. Как протестировать: распечатать свое приложение на ПК, сохранить в растровое изображение, скопировать растровое изображение на ноутбук. Или, наоборот, распечатайте экран на ноутбуке и проверьте растровое изображение на ПК.   -  person Cosmin Prund    schedule 16.07.2010


Ответы (3)


Я использовал графическую библиотеку (AggPas) для рисования графики, и одна из вещей, которые я заметил, это то, что мне всегда нужна линия Bitmap.PixelFormat = pf32bit, чтобы заставить ее рисовать прозрачность.

Сказав, что я использую TransformImage из библиотеки AggPas для копирования изображения с прозрачным фоном в другое, AggPas принимает только pf24bit или pf32bits в качестве форматов пикселей (в противном случае он не прикрепляется к растровому изображению)

person James Barrass    schedule 16.07.2010

Я видел подобное поведение на разных машинах в прошлом (несколько лет назад).

Они были вызваны разными видеокартами и драйверами. Либо NVideo, либо ATI давали неверные результаты, но я забыл, какие именно.

Его можно было воспроизвести как на ноутбуках, так и на обычных ПК.

Итак: какие видеокарты и драйверы вы используете?

- Джерун

person Jeroen Wiert Pluimers    schedule 16.07.2010
comment
Кажется, это проблема. После исследования некоторые машины с такой же глубиной цвета, что и рабочие машины, не работают, а цвета, которые они не отображают, включают черный на белом. но когда я посмотрел на видеодрайверы, я обнаружил, что все машины, которые работали, имели драйверы / карты Nvidia, и все машины, у которых не было ATI. есть ли способ заставить вещи работать? - person Arthur; 16.07.2010
comment
@Arthur: тогда я не нашел решения, как заставить его работать. Но затем клиент отошел от машин на базе ATI, и проблема решилась сама собой. - person Jeroen Wiert Pluimers; 17.07.2010

Я бы явно установил формат растрового изображения на pf32bit для каждого создаваемого растрового изображения, чтобы убедиться, что проблема не в преобразовании цветов с 32 на 16 бит (если это собственное разрешение видео создаваемых растровых изображений), что может повлиять на работу прозрачности. Кроме того, в прошлом мне больше повезло с настройкой цвета прозрачности.

Другой вариант - возможно, лучший в долгосрочной перспективе - вместо этого установить альфа-канал на изображениях (т. Е. Использовать файлы PNG) и использовать функцию GDI AlphaBlend () для рисования графики.

person GrandmasterB    schedule 16.07.2010