Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2011, 09:52   #1
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
Вопрос TImage растягивание без масштабирования

Есть такая картинка:


Нужно превратить её в:


Как можно реализовать подобное?
JoLan вне форума Ответить с цитированием
Старый 02.02.2011, 10:16   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Св-во Strech у имиджа в true
SERG1980 вне форума Ответить с цитированием
Старый 02.02.2011, 10:31   #3
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

То ли я не так понял, почитав про Stretch, то ли Вы меня.

Нужно растянуть картинку без искажения, то есть разрезать посередине, отрезанную часть сдвинуть на n пикселей и заполнить разрез шаблоном, взятым из вертикальной полоски в 1 пиксель слева (допустим) от места разреза.
JoLan вне форума Ответить с цитированием
Старый 02.02.2011, 10:57   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ручками программно в канве TImage
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.02.2011, 11:01   #5
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

Можно пример или ссылку на ман по Canvas? T_T

З.Ы. На моем Delphi документации нет.
JoLan вне форума Ответить с цитированием
Старый 02.02.2011, 12:50   #6
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var b2:TBitMap;
    r1,r2:TRect;
    i,w:integer;
begin
 w:=Round(image1.Width/2);
 r1:=Bounds(0,0,w,image1.Height);
 r2:=Bounds(w,0,image1.Width-w,image1.Height);
 //***********************************************************
 image1.Width:=image1.Width+100;
 b2:=TBitMap.Create;
 b2.Width:=image1.Width;
 b2.Height:=image1.Height;
 b2.Canvas.CopyRect(r1,image1.Picture.Bitmap.Canvas,r1);
 r1:=Bounds(b2.Width-w,0,w,b2.Height);
 b2.Canvas.CopyRect(r1,image1.Picture.Bitmap.Canvas,r2);
 for i:= w to b2.Width-w do
  begin
   r1:=Bounds(i-1,0,1,b2.Height);
   r2:=Bounds(i,0,1,b2.Height);
   b2.Canvas.CopyRect(r2,b2.Canvas,r1);
  end;
 image1.Picture.Assign(b2);
 b2.Free;
end;
Вложения
Тип файла: zip 1.ZIP (333.5 Кб, 32 просмотров)
SERG1980 вне форума Ответить с цитированием
Старый 02.02.2011, 14:28   #7
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

{Кнопки "спасибо" не видно...
Спасибо большое!}


upd: Все работает замечательно, только теперь появилась другая проблема: использую Vampyre Imaging Library, загружаю на форму dds с альфа-каналом. При использовании Canvas он пропадает, т.е. вместо полупрозрачного черного получаю непрозрачный черный.

Последний раз редактировалось Stilet; 04.02.2011 в 14:16.
JoLan вне форума Ответить с цитированием
Старый 03.02.2011, 16:55   #8
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

попробуйте вот так, но я не уверен что поможет
Код:
......
b2:=TBitMap.Create;
b2.PixelFormat:=pf32bit;
b2.Width:=image1.Width;
.......
SERG1980 вне форума Ответить с цитированием
Старый 04.02.2011, 13:34   #9
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

Проблема решена использованием мозгов и документации (полезно иногда, кстати):
Код:
uses ImagingTypes, Imaging, ImagingComponents;
...
procedure TForm1.LoadImage(Filestr:String; Wdth,Hght:integer; NeedResize:Boolean);
var Img,Temp,Temp2: TImageData;
    ImgBitmap: TImagingBitmap;
    dynImage:TImage;
    i,w,h,iw,ih,tw,th:integer;
begin
  InitImage(Img);
  LoadImageFromFile(Edit2.Text, Img);
  if NeedResize then begin
    InitImage(Temp);
    NewImage(Wdth,Hght,Img.Format,Temp);
    iw := Img.Width;
    ih := Img.Height;
    tw := Temp.Width;
    th := Temp.Height;
    w := Round(Img.Width/2);
    h := Round(Img.Height/2);
    CopyRect(Img, 0, 0, iw-w, ih-h, Temp, 0, 0);
    CopyRect(Img, w, 0, iw-w, ih-h, Temp, tw-w, 0);
    CopyRect(Img, 0, h, iw-w, ih-h, Temp, 0, th-h);
    CopyRect(Img, w, h, iw-w, ih-h, Temp, tw-w, th-h);
    NewImage(Wdth,Hght,Temp.Format,Temp2);
    CopyRect(Temp,0,0,tw,th,Temp2,0,0);
    for i := 0 to Wdth - iw+1 do CopyRect(Temp2, w-1, 0, 1, th, Temp, w+i, 0);
    CopyRect(Temp,0,0,tw,th,Temp2,0,0);
    for i := 0 to Hght-ih+1 do CopyRect(Temp2, 0, h-1, tw,1, Temp, 0, h+i);
    FreeImage(Temp2);
    ImgBitmap := TImagingBitmap.Create;
    ImgBitmap.AssignFromImageData(Temp);
    FreeImage(Temp);
  end else begin
    ImgBitmap := TImagingBitmap.Create;
    ImgBitmap.AssignFromImageData(Img);
  end;
  dynImage := TImage.Create(Form1);
  dynImage.Parent := ScrollBox1;
  dynImage.Left := 0;
  dynImage.Top := 0;
  dynImage.Width := Wdth;
  dynImage.Height := Hght;
  dynImage.Picture.Graphic := ImgBitmap;
  FreeImage(Img);
end;
Картинка загружается в scrollbox, т.к. важно было увидеть всю картинку без подгонки. Так же в процедуре CopyRect юнита Imaging закомментировал строки:
Код:
if OldFormat <> ifUnknown then
ConvertImage(DstImage, OldFormat);
что существенно сократило время перерисовки с 12-14с до ~0.3-0.5 с.

Делал это исключительно для dds и под себя.

Исходная картинка:


Перерисованная:

Последний раз редактировалось JoLan; 04.02.2011 в 15:59.
JoLan вне форума Ответить с цитированием
Старый 05.04.2011, 18:01   #10
kirsan007
Пользователь
 
Аватар для kirsan007
 
Регистрация: 24.02.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от SERG1980 Посмотреть сообщение
Код:
procedure TForm1.Button1Click(Sender: TObject);
var b2:TBitMap;
    r1,r2:TRect;
    i,w:integer;
begin
 w:=Round(image1.Width/2);
 r1:=Bounds(0,0,w,image1.Height);
 r2:=Bounds(w,0,image1.Width-w,image1.Height);
 //***********************************************************
 image1.Width:=image1.Width+100;
 b2:=TBitMap.Create;
 b2.Width:=image1.Width;
 b2.Height:=image1.Height;
 b2.Canvas.CopyRect(r1,image1.Picture.Bitmap.Canvas,r1);
 r1:=Bounds(b2.Width-w,0,w,b2.Height);
 b2.Canvas.CopyRect(r1,image1.Picture.Bitmap.Canvas,r2);
 for i:= w to b2.Width-w do
  begin
   r1:=Bounds(i-1,0,1,b2.Height);
   r2:=Bounds(i,0,1,b2.Height);
   b2.Canvas.CopyRect(r2,b2.Canvas,r1);
  end;
 image1.Picture.Assign(b2);
 b2.Free;
end;
самый непонятный говнокод из всех непонятных говнокодов что я в жизни видел.
Отаку
kirsan007 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Растягивание формулы fadsozaur Microsoft Office Excel 28 08.08.2013 17:54
Алгоритм масштабирования Alex Cones Свободное общение 4 25.05.2010 16:02
Существует ли компонент для автоматического масштабирования zmey31313 Компоненты Delphi 1 12.12.2009 03:11
растягивание значений без формата ячейки marc-nikita Microsoft Office Excel 3 08.12.2009 11:24