Страница: 1 |
|
Вопрос: Правильно отмасштабировать Bitmap?
|
Добавлено: 19.01.04 18:34
|
|
Автор вопроса: Павло
|
Никто не сталкивался с проблемой правильно отмасштабировать BitMap для ListView например? В ListView источником картинок является ImageList, который мастштабирует все картинки в один размер. Но если они не одинаковые, не иконки? Некрасиво, однако. Может есть готовый пример? Разбираться некогда...
Ответить
|
Номер ответа: 5 Автор ответа: Павло
Вопросов: 8 Ответов: 24
|
Профиль | | #5
|
Добавлено: 20.01.04 11:38
|
Если будут предложения по оптимизации - с удовольствием выслушаю. Мне ей часто придется пользоваться. Public Function createIcon(ByVal OrigImage As Image, ByVal MySide As Integer, _ByVal BackGrColor As Color, ByVal Border As Color, Optional ByVal BorderWeight As Integer = 1) As Image'OrigImage - исходная картинка'MySide - сторона квадрата в пикселях 'BackGrColor - цвет фона'Border - цвет границы'BorderWeight - толщина границыDim RetBMP As Bitmap = _New Bitmap(MySide, MySide, PixelFormat.Format24bppRgb) 'Возвращаемая картинкаDim TempBmp As Bitmap 'Временный BitMapDim MyYSub As Single 'Для подсчета отношения высотыDim MyXSub As Single 'Для подсчета отношения шириныDim MyNewX As Integer 'Для подсчета новой шириныDim MyNewY As Integer 'Для подсчета новой высотыDim Ix As Integer 'Итерации по XDim Iy As Integer 'Итерации по YDim OrigX As Integer 'Итерации внутри оригинальной картинки по XDim OrigY As Integer 'Итерации внутри оригинальной картинки по Y'Проверка значенийIf IsNothing(OrigImage) Or MySide = 0 Or BorderWeight < 0 Then Return Nothing : Exit Function'Подсчет отношенияMyXSub = MySide / OrigImage.Width MyYSub = MySide / OrigImage.Height 'В зависимости от отношения сторон по разному создается новая картинка'Заполняется либо по вертикали, либо по горизонтали'//// --------- По вертикалиIf MyXSub < MyYSub ThenMyNewX = OrigImage.Width * MyXSub MyNewY = OrigImage.Height * MyXSub TempBmp = New Bitmap(OrigImage, MyNewX, MyNewY)'Первая пустая зонаFor Iy = 0 To Round((MySide - MyNewY) / 2)For Ix = 0 To MySide - 1'Создание рамкиIf Iy < BorderWeight Or Ix >= MySide - BorderWeight Or Ix < BorderWeight ThenRetBMP.SetPixel(Ix, Iy, Border) Else 'Создание фонаRetBMP.SetPixel(Ix, Iy, BackGrColor) End IfNextNext
Ответить
|
Номер ответа: 6 Автор ответа: Павло
Вопросов: 8 Ответов: 24
|
Профиль | | #6
|
Добавлено: 20.01.04 11:38
|
Если будут предложения по оптимизации - с удовольствием выслушаю. Мне ей часто придется пользоваться. Public Function createIcon(ByVal OrigImage As Image, ByVal MySide As Integer, _ByVal BackGrColor As Color, ByVal Border As Color, Optional ByVal BorderWeight As Integer = 1) As Image'OrigImage - исходная картинка'MySide - сторона квадрата в пикселях 'BackGrColor - цвет фона'Border - цвет границы'BorderWeight - толщина границыDim RetBMP As Bitmap = _New Bitmap(MySide, MySide, PixelFormat.Format24bppRgb) 'Возвращаемая картинкаDim TempBmp As Bitmap 'Временный BitMapDim MyYSub As Single 'Для подсчета отношения высотыDim MyXSub As Single 'Для подсчета отношения шириныDim MyNewX As Integer 'Для подсчета новой шириныDim MyNewY As Integer 'Для подсчета новой высотыDim Ix As Integer 'Итерации по XDim Iy As Integer 'Итерации по YDim OrigX As Integer 'Итерации внутри оригинальной картинки по XDim OrigY As Integer 'Итерации внутри оригинальной картинки по Y'Проверка значенийIf IsNothing(OrigImage) Or MySide = 0 Or BorderWeight < 0 Then Return Nothing : Exit Function'Подсчет отношенияMyXSub = MySide / OrigImage.Width MyYSub = MySide / OrigImage.Height 'В зависимости от отношения сторон по разному создается новая картинка'Заполняется либо по вертикали, либо по горизонтали'//// --------- По вертикалиIf MyXSub < MyYSub ThenMyNewX = OrigImage.Width * MyXSub MyNewY = OrigImage.Height * MyXSub TempBmp = New Bitmap(OrigImage, MyNewX, MyNewY)'Первая пустая зонаFor Iy = 0 To Round((MySide - MyNewY) / 2)For Ix = 0 To MySide - 1'Создание рамкиIf Iy < BorderWeight Or Ix >= MySide - BorderWeight Or Ix < BorderWeight ThenRetBMP.SetPixel(Ix, Iy, Border) Else 'Создание фонаRetBMP.SetPixel(Ix, Iy, BackGrColor) End IfNextNext
Ответить
|
Номер ответа: 7 Автор ответа: Павло
Вопросов: 8 Ответов: 24
|
Профиль | | #7
|
Добавлено: 20.01.04 11:45
|
'Врисовываю картинкуFor Iy = Round((MySide - MyNewY) / 2) + 1 To (MySide - (MySide - MyNewY) \ 2) - 1 OrigX = 0 For Ix = 0 To MySide - 1'Создание рамкиIf Ix >= MySide - BorderWeight Or Ix < BorderWeight ThenRetBMP.SetPixel(Ix, Iy, Border) Else 'Создание фонаRetBMP.SetPixel(Ix, Iy, TempBmp.GetPixel(OrigX, OrigY)) End IfOrigX += 1 NextOrigY += 1 Next'Вторая пустая зонаFor Iy = MySide - 1 To MySide - (MySide - MyNewY) \ 2 Step -1For Ix = 0 To MySide - 1'Создание рамкиIf Iy >= MySide - BorderWeight Or Ix >= MySide - BorderWeight Or Ix < BorderWeight ThenRetBMP.SetPixel(Ix, Iy, Border) Else 'Создание фонаRetBMP.SetPixel(Ix, Iy, BackGrColor) End IfNextNext'\\\\ --------- По вертикалиElse '//// --------- По горизонталиMyNewX = OrigImage.Width * MyYSub MyNewY = OrigImage.Height * MyYSub TempBmp = New Bitmap(OrigImage, MyNewX, MyNewY)'Первая пустая зонаFor Ix = 0 To Round((MySide - MyNewX) / 2)For Iy = 0 To MySide - 1'Создание рамкиIf Iy < BorderWeight Or Iy >= MySide - BorderWeight Or Ix < BorderWeight ThenRetBMP.SetPixel(Ix, Iy, Border) Else 'Создание фонаRetBMP.SetPixel(Ix, Iy, BackGrColor) End IfNextNext'Врисовываю картинкуFor Ix = Round((MySide - MyNewX) / 2) + 1 To (MySide - (MySide - MyNewX) \ 2) - 1OrigY = 0 For Iy = 0 To MySide - 1'Создание рамкиIf Iy >= MySide - BorderWeight Or Iy < BorderWeight ThenRetBMP.SetPixel(Ix, Iy, Border) Else 'Создание фонаRetBMP.SetPixel(Ix, Iy, TempBmp.GetPixel(OrigX, OrigY)) End IfOrigY += 1 NextOrigX += 1 Next'Вторая пустая зонаFor Ix = MySide - 1 To MySide - (MySide - MyNewX) \ 2 Step -1For Iy = 0 To MySide - 1'Создание рамкиIf Iy >= MySide - BorderWeight Or Ix >= MySide - BorderWeight Or Iy < BorderWeight ThenRetBMP.SetPixel(Ix, Iy, Border) Else 'Создание фонаRetBMP.SetPixel(Ix, Iy, BackGrColor) End IfNextNextEnd If '\\\\ --------- По горизонталиОтветить
|
Номер ответа: 8 Автор ответа: Павло
Вопросов: 8 Ответов: 24
|
Профиль | | #8
|
Добавлено: 20.01.04 11:47
|
Return CType(RetBMP, Image)End Function
Ответить
|
Страница: 1 |
Поиск по форуму