Конференция "KOL" » динамическая загрузка в ImageList искажаются цвета [Delphi, Windows]
 
  • jam (29.10.10 17:47) [0]
    Здравствуйте.
    код следующий:

    procedure TForm1.Button1Click(Sender: PObj);
    begin
    form1.ImageList1.LoadFromFile(PChar(getstartdir+'1.bmp'),clBlack,itBitmap);
    end;
    procedure TForm1.PaintBox1Paint(Sender: PControl; DC: HDC);
    begin
     form1.ImageList1.Draw(0,DC,0,0);
    end;


    при этом все цвета картинки получаются искаженными. Masked ставлю false. Пробовал разные варианты свойства Colors. Тот же результат.
    если с теми же настройками загружаю картинку статично, а не после запуска, то все отрисовывается нормально. как только загружаю динамически по нажатии кнопки, цвета искажаются.
    подскажите пожалуйста, что я делаю неправильно?
    виндовс XP, делфи 7, версия KOL 2.86
  • Vladimir Kladov © (29.10.10 18:40) [1]
    Что значит статично, в MCK что ли? Посмотрите код, который генерит MCK.
  • jam (30.10.10 10:54) [2]
    да, я делаю с использованием MCK. если загружаю картинку через инспектор объектов, то она отображается нормально
    код в unit1_1.inc:

    Result.ImageList1 := NewImageList( Result.Form );
    Result.ImageList1.Colors := ilcColor;


    при этом в инспекторе объектов выставлено значение ilcColorDDB, не знаю почему

    пробую так:

    procedure TForm1.PaintBox2Paint(Sender: PControl; DC: HDC);
     var i:PImageList;
    begin
     i:=NewImageList(nil);
     i.ImgWidth:=70;
     i.ImgHeight:=70;
     i.Masked:=false;
     i.Colors:=ilcColor24;
     i.LoadFromFile(PChar(getstartdir+'3.bmp'),clBlack,itBitMap);
     i.Draw(0,DC,0,0);
     i.Free;
    end;


    цвета получаются искаженными. Colors пробовал всевозможные значения
  • Vladimir Kladov © (30.10.10 11:30) [3]
    Код загрузки смотрите. Код создания imagelist'а мало на что влияет. Сам ресурс откройте в Borland Image Editor, посмотрите, не был ли он изменен. MCK может сокращать число цветов в ресурсе для экономии размера, если это не уменьшает реально используемое число цветов.
  • Vladimir Kladov © (30.10.10 11:55) [4]
    Я вот про что говорю:


       Result.ImageList1 := NewImageList( Result.Form );
       Result.ImageList1.Colors := ilcColorDDB;
         {$R Form1_ImageList1.res}
       Result.ImageList1.AddMasked( LoadBmp( hInstance, 'FORM1_IMAGELIST1', Result.ImageList1 ), clBlack );



    Последняя строка выполняет загрузку.
  • jam (30.10.10 14:43) [5]
    если я делаю загрузку из ресурса, то отображается нормально.

    procedure TForm1.PaintBox2Paint(Sender: PControl; DC: HDC);
     var i:PImageList;
    begin
     i:=NewImageList(form1.Form);
     i.Clear;
     i.ImgWidth:=70;
     i.ImgHeight:=70;
     i.Masked:=false;
     i.Colors:=ilcColorDDB;
     i.Add( LoadBmp( hInstance, 'FORM1_IMAGELIST1', i ), 0 );
     i.Draw(0,DC,0,0);
     i.Free;
    end;


    а если вместо
    i.Add( LoadBmp( hInstance, 'FORM1_IMAGELIST1', i ), 0 );
    пытаюсь загрузить рисунок из файла на диске:
    i.LoadFromFile(PChar('3.bmp'),clNone,itBitMap);
    то цвета искажаются.
    при этом если загружаю в отдельный битмап и из него рисую, то все в порядке. где делаю ошибку, не пойму. пробовать менять формат картинки?
    а у Вас подобный код работает? при загрузке в ImageList из файла на диске? :)
  • Vladimir Kladov © (30.10.10 15:05) [6]
    Ничего не исказилось. Взял ImageList, нажал на его свойство Bitmap, выбрал Save, сохранил в папку проекта как test.bmp.

    Вот таким кодом загрузил:
    procedure TForm1.ImageShow1Click(Sender: PObj);
    var i: Integer;
    begin
       i := ImageShow1.CurIndex;
       inc(i);
       if  i >= ImageShow1.ImageListNormal.Count then
           i := 0;
       ImageShow1.CurIndex := i;
    end;

    procedure TForm1.Button4Click(Sender: PObj);
    begin
       ImageList1.LoadFromFile( PChar( GetStartDir + 'test.bmp' ), clNone, itBitmap );
       ImageShow1.CurIndex := 0;
       ImageShow1.Invalidate;
    end;



    и проверил, предварительно для надежности очистил ImageList. Цвета точно такие же как и при загрузке из ресурса.
  • jam (30.10.10 16:17) [7]
    делаю тоже самое, цвета искажены.
    попробую на другом компе и с последней версией KOL
  • Vladimir Kladov © (30.10.10 19:32) [8]
    Лучше сделайте маленький тестовый пример со своей картинкой, упакуйте и вложите. Только не под Delphi 2010.
  • jam © (31.10.10 11:59) [9]
    сделал тестовый пример
    три одинаковых ImageList, в один гружу картинку через инспектор объектов. во второй с помощью ImageList.LoadFromFile. в третий добавляю с помощью другого битмапа:

     b:=NewBitMap(70,54);
     b.LoadFromFile('1.bmp');
     form1.ImageList3.Add(b.Handle,0);
     b.Free;


    в первом и третьем случае отображается правильно, во втором случае - цвета искажаются. видимо дело в методе ImageList.LoadFromFile, что-то не могу разобраться с ним.
    да, переустановил с нуля делфи (седьмой) и KOL&MCK версии 3.
  • Vladimir Kladov © (31.10.10 13:23) [10]
    Я так и не увидел примера, скриншотов или тестового проекта. Соответственно, фраза "цвета искажаются" непонятна.
  • Vladimir Kladov © (31.10.10 13:26) [11]

    procedure TForm1.Button6Click(Sender: PObj);
    var B: PBitmap;
    begin
       B := NewBitmap( 0, 0 );
       B.LoadFromFile( PChar( GetStartDir + 'test.bmp' ) );
       ImageList1.Add( B.ReleaseHandle, 0 );
       B.Free;
       ImageShow1.CurIndex := 0;
       ImageShow1.Invalidate;
    end;



    Цвета те же самые.
  • jam © (31.10.10 14:36) [12]
    скиншот вот http://img541.imageshack.us/i/123we.jpg/
    код уже писал. архив с примером я не знаю как тут на форуме выложить, выслал на email
  • Vladimir Kladov © (31.10.10 15:31) [13]
    В методе TImageList.LoadFromFile дескриптор имаджлиста пересоздается апи-функцией ImageList_LoadImage. При этом нет никакой возможности указать системе, какой формат цвета использовать, свойство Colors не используется. Как системе захочется, так она и исказит. По умному, она должна БЫ использовать цвета из самой картинки. Но у программистов из Майкрософт всегда есть свои особые правила. В данном случае, видимо, картинка режется до 16 системных цветов.

    Чем не устраивает метод TImageList.Add, ведь он дает правильный результат?

    Чтобы выложить любой ресурс в любой форум, ищется ресурс (например, поисковиком), который позволяет выкладывать произвольные файлы для скачивания. Например, ipicture.ru, radikal.ru для картинок, webfile.ru, slil.ru, zalil.ru для архивов.
  • jam © (31.10.10 17:29) [14]
    да в принципе устраивает, просто зачем лишние телодвижения, если есть прямой метод для загрузки :) думал что неправильно его использую. ну теперь буду через Add делать.
    спасибо за потраченное время и за помощь!
  • QAZ (01.11.10 13:05) [15]

    > В методе TImageList.LoadFromFile дескриптор имаджлиста пересоздается
    > апи-функцией ImageList_LoadImage. При этом нет никакой возможности
    > указать системе, какой формат цвета использовать, свойство
    > Colors не используется. Как системе захочется, так она и
    > исказит. По умному, она должна БЫ использовать цвета из
    > самой картинки. Но у программистов из Майкрософт всегда
    > есть свои особые правила.

    проблемма очередной раз не у микрософта ,как бы вам этого не хотелось а у кол\мск
    у ImageList_LoadImage достаточно управляющих флагов,в том числе и LR_CREATEDIBSECTION

    про "искуственный интелект" заложеный в МСК по поводу конверсии цветов скажу одно - убрать нафиг и забыть !!!
    в свое время долго штырился с дизайнтайм фокусами когда из 8битной картинки МСК пихал в ресурсы 32!!! битную
    в итоге юзаю ванапи и нет проблем с картинками
  • jam © (02.11.10 16:19) [16]
    QAZ, спасибо за подсказку.

    form1.ImageList2.Handle:=ImageList_LoadImage(0,'1.bmp',form1.ImageList2.ImgWidth ,form1.imagelist2.AllocBy,CLR_NONE,IMAGE_BITMAP,LR_LOADFROMFILE or LR_CREATEDIBSECTION);


    такой код загружает правильно.
 
Конференция "KOL" » динамическая загрузка в ImageList искажаются цвета [Delphi, Windows]
Есть новые Нет новых   [120349   +19][b:0][p:0.002]