-
Здравствуйте. код следующий:
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
-
Что значит статично, в MCK что ли? Посмотрите код, который генерит MCK.
-
да, я делаю с использованием 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 пробовал всевозможные значения
-
Код загрузки смотрите. Код создания imagelist'а мало на что влияет. Сам ресурс откройте в Borland Image Editor, посмотрите, не был ли он изменен. MCK может сокращать число цветов в ресурсе для экономии размера, если это не уменьшает реально используемое число цветов.
-
Я вот про что говорю:
Result.ImageList1 := NewImageList( Result.Form );
Result.ImageList1.Colors := ilcColorDDB;
Result.ImageList1.AddMasked( LoadBmp( hInstance, 'FORM1_IMAGELIST1', Result.ImageList1 ), clBlack );
Последняя строка выполняет загрузку.
-
если я делаю загрузку из ресурса, то отображается нормально.
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 из файла на диске? :)
-
Ничего не исказилось. Взял 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. Цвета точно такие же как и при загрузке из ресурса.
-
делаю тоже самое, цвета искажены. попробую на другом компе и с последней версией KOL
-
Лучше сделайте маленький тестовый пример со своей картинкой, упакуйте и вложите. Только не под Delphi 2010.
-
сделал тестовый пример три одинаковых ImageList, в один гружу картинку через инспектор объектов. во второй с помощью ImageList.LoadFromFile. в третий добавляю с помощью другого битмапа:
b:=NewBitMap(70,54);
b.LoadFromFile('1.bmp');
form1.ImageList3.Add(b.Handle,0);
b.Free;
в первом и третьем случае отображается правильно, во втором случае - цвета искажаются. видимо дело в методе ImageList.LoadFromFile, что-то не могу разобраться с ним. да, переустановил с нуля делфи (седьмой) и KOL&MCK версии 3.
-
Я так и не увидел примера, скриншотов или тестового проекта. Соответственно, фраза "цвета искажаются" непонятна.
-
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;
Цвета те же самые.
-
-
В методе TImageList.LoadFromFile дескриптор имаджлиста пересоздается апи-функцией ImageList_LoadImage. При этом нет никакой возможности указать системе, какой формат цвета использовать, свойство Colors не используется. Как системе захочется, так она и исказит. По умному, она должна БЫ использовать цвета из самой картинки. Но у программистов из Майкрософт всегда есть свои особые правила. В данном случае, видимо, картинка режется до 16 системных цветов.
Чем не устраивает метод TImageList.Add, ведь он дает правильный результат?
Чтобы выложить любой ресурс в любой форум, ищется ресурс (например, поисковиком), который позволяет выкладывать произвольные файлы для скачивания. Например, ipicture.ru, radikal.ru для картинок, webfile.ru, slil.ru, zalil.ru для архивов.
-
да в принципе устраивает, просто зачем лишние телодвижения, если есть прямой метод для загрузки :) думал что неправильно его использую. ну теперь буду через Add делать. спасибо за потраченное время и за помощь!
-
> В методе TImageList.LoadFromFile дескриптор имаджлиста пересоздается > апи-функцией ImageList_LoadImage. При этом нет никакой возможности > указать системе, какой формат цвета использовать, свойство > Colors не используется. Как системе захочется, так она и > исказит. По умному, она должна БЫ использовать цвета из > самой картинки. Но у программистов из Майкрософт всегда > есть свои особые правила.
проблемма очередной раз не у микрософта ,как бы вам этого не хотелось а у кол\мск у ImageList_LoadImage достаточно управляющих флагов,в том числе и LR_CREATEDIBSECTION
про "искуственный интелект" заложеный в МСК по поводу конверсии цветов скажу одно - убрать нафиг и забыть !!! в свое время долго штырился с дизайнтайм фокусами когда из 8битной картинки МСК пихал в ресурсы 32!!! битную в итоге юзаю ванапи и нет проблем с картинками
-
QAZ, спасибо за подсказку.
form1.ImageList2.Handle:=ImageList_LoadImage(0,'1.bmp',form1.ImageList2.ImgWidth ,form1.imagelist2.AllocBy,CLR_NONE,IMAGE_BITMAP,LR_LOADFROMFILE or LR_CREATEDIBSECTION);
такой код загружает правильно.
|