Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение картинки, Размер сохранённой картинки 
:(
    Опции темы
kashey
Дата 21.2.2009, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.12.2008

Репутация: нет
Всего: 1



  Написал небольшую программу по обработке изображений .bmp . 
 Программа берёт исходную картинку, потом её уменьшает. Однако реально размер изменить не получилось - при сохранении остался прежним.
 Не подскажете, что нужно сделать?
PM MAIL WWW   Вверх
Курсант
Дата 21.2.2009, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



kashey, Непонятно в чем у Вас именно проблема - в неправильном сжатии или в неправильном сохранении. Что касается сохранения - нужно воспользоваться методом SaveToFile. Что касается сжатия - можно воспользоваться API функциями, можно сжимать самому - тут как хотите... Лучше самому - тогда можно пересчет цветов сделать, в общем потеря качества будет намного меньше. Если API, то Вам поможет функция StretchBlt - http://www.cyberguru.ru/programming/visual...scr-page30.html . А сделать собственный обработчик битмапа можно примерно так:


Код

procedure compressimg ();
var bmp1, bmp2 : TBitmap; // bmp1 - для исходного рисунка, bmp2 - для конечного...
      w, h : integer;
      kc, minx,miny, maxx, maxy, k, l, color, newr, newg, newb, i, j : integer; 
begin
bmp1:=TBitmap.Create;
bmp2:=TBitmap.Create;
w:=StrToInt (Edit3.Text); // в Edit3 пользователь должен ввести ширину рисунка, которую он хочет получить
h := StrToInt (Edit4.Text); // а в Edit4 - длину...
bmp1.LoadFromFile (Edit1.Text); // из Edit1 получаем адрес исходного рисунка и загружаем рисунок в bmp1;
bmp2.Width := w;
bmp2.Height := h;
for i:=0 to w-1 do
   for j:=0 to h-1 do begin
      minx := i * bmp1.Width div w; // высчитываем x 1-го пикселя bmp1, соответствующего i-му от левого края пикселю bmp2
      maxx := (i+1)* bmp1.Width div w; // и x последнего пикселя bmp1, попадающего при сжатии в i-й от левого края пиксель bmp2
      miny := j * bmp1.Height div h; // аналогично для y - верхний пиксель
      maxy := (j+1) * bmp1.Height div h; // и нижний пиксель
      newr := 0; newg := 0; newb := 0; // обнуляем накопители составляющих цвета
      kc := (maxx-minx+1)*(maxy-miny+1); // смотрим, сколько пикселей у нас будет участвовать в подсчете среднего цвета
      for k:= minx to maxx do  // выдергиваем по одному нужные пиксели из bmp1 и добавляем в накопители.
         for l:= miny to maxy do begin
           color := bmp1.Canvas.Pixels[k,l];
           newb := newb + (color and 16711680) div 65536; // Выделяем синюю компоненту цвета и прибавляем к тому что накоплено
           newg := newg + (color and 65280) div 256; // То же самое для зеленой
           newr := newr + (color and 255); // и для красной
         end;
      newb := (newb div kc * 65536); // теперь делим накопленное на количество суммированных пикселей и ставим на свое 
// место
      newg := (newg div kc * 256); // то же...
      newr := (newr div kc); // то же...
      bmp2.canvas.pixels[i,j]:= newb or newg or newr; // вставляем полученный пиксель в битмап
   end;
   bmp2.SaveToFile (Edit2.Text); // сохраняем результат по адресу, указанному в Edit2... Если вы хотите заменить исходный рисунок - пишите
// по адресу Edit1.Text
   bmp1.Destroy;
   bmp2.Destroy;
end;


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

Это сообщение отредактировал(а) Курсант - 21.2.2009, 17:23
PM ICQ Skype   Вверх
xfoby
Дата 21.2.2009, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 21.2.2009
Где: Анапа

Репутация: нет
Всего: нет



kashey, сохраняй с канвы...тогда сохранит все проделанные визуальные изменения smile
PM MAIL WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0667 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.