Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Вниз

Масштабирование изображения   Найти похожие ветки 

 
mobila   (2006-05-03 18:16) [0]

Мастера программирования подскажите: вот мини программа которая позволяет отмасштабировать изображение, но есть небольшая проблема при уменьшении изображение теряет своё качество (т.е. становится более чётким и чуть-чуть неровным )
Я сравнивал изображение полученное этой программой и фотошопом, у фотошопа при уменьшение изображение получается гладким .
Подскажите что нужно изменить что бы было как в фотошопе.

Вот мая софтина  (программа для нарезания картинок на мобильники)
http://siemensx.metroland.ru/modules/mydownloads/visit.php?lid=137

procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBItmap;
jpg: TJpegImage;
scale: Double;
begin
if opendialog1.execute then
begin
 jpg := TJpegImage.Create;
 try
 jpg.Loadfromfile( opendialog1.filename );
 if jpg.Height > jpg.Width then
 scale := 50 / jpg.Height
 else
 scale := 50 / jpg.Width;
 bmp:= Tbitmap.Create;
 try
 {Create thumbnail bitmap, keep pictures aspect ratio}
 bmp.Width := Round( jpg.Width * scale );
 bmp.Height:= Round( jpg.Height * scale );
 bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
 {Draw thumbnail as control}
 Self.Canvas.Draw( 100, 10, bmp );
 {Convert back to JPEG and save to file}
 jpg.Assign( bmp );
 jpg.SaveToFile(ChangeFileext( opendialog1.filename, "_thumb.JPG" ));
 finally
 bmp.free;
 end;
 finally
 jpg.free;
 end;
end;
end;


 
Sambrook ©   (2006-05-04 18:42) [1]

Перед строкой
bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
вставьте

SetStretchBltMode(bmp.canvas.handle, newMode),

где newMode= ColorOnColor или HalfTone.
Подробности в справке.


 
mobila   (2006-05-05 20:55) [2]

Я сделал всё так как вы сказали перед строкой
bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg ); вставил сначало
SetStretchBltMode(bmp.canvas.handle, ColorOnColor); а
потом  не увидев результатов попробывал
SetStretchBltMode(bmp.canvas.handle, HalfTone);
но не одна не вторая строчка не пренесла результатов.
Может кроме этого ещё что то надо вставить. Очень нужно довести программу до ума подскажите пожалуйста!!!


 
Мефисто   (2006-05-05 21:01) [3]

Ищи готовые решения по ключевому слову Stretch. Дельфевая StretchDraw реализована не лучшим способом. поэтому следует искать альтернативные решения. Также рекомендуется к прочтению книга Фень Юань "Программирование графики в windows"


 
mobila   (2006-05-06 11:58) [4]

Эта книга для программирования на  C/C++
http://irazin.ru/Downloads/Books/Yuan.rar


 
Jeer ©   (2006-05-06 13:07) [5]

mobila   (06.05.06 11:58) [4]

Спасибо за информацию, но как это связано с сабжем на Delphi ?


 
Мефисто   (2006-05-06 15:02) [6]

Jeer  ©   (06.05.06 13:07) [5]

Есть алгоритм, а язык программирования уже значения не имеет :)
Темболее до изложения кода автор книги еще все и разжовывает как это работает и от куда чего берется ;)


 
Sapersky   (2006-05-06 15:11) [7]

"Альтернативное" решение называется StretchBlt (WinAPI).
Т.к. Canvas.StretchDraw устанавливает StretchBltMode по своему усмотрению.


 
Jeer ©   (2006-05-06 15:13) [8]

Мефисто   (06.05.06 15:02) [6]


> а язык программирования уже значения не имеет :)


Не у всех это с рождения:)


 
mobila   (2006-05-07 20:58) [9]

Парни лучшеб вы мне помогли а не вели рассуждения я пишу только на делфи. Дайти кто нибудь рабочий алгоритм. Или исходник с ним.


 
Мефисто   (2006-05-07 21:59) [10]

SetStretchBltMode()

Sets the bitmap-stretching mode for the StretchBlt member function.

int SetStretchBltMode(
  int nStretchMode
);

Parameters
nStretchMode
Specifies the stretching mode. It can be any of the following values: Value Description
BLACKONWHITE Performs a Boolean AND operation using the color values for the eliminated and existing pixels. If the bitmap is a monochrome bitmap, this mode preserves black pixels at the expense of white pixels.
COLORONCOLOR Deletes the pixels. This mode deletes all eliminated lines of pixels without trying to preserve their information.
HALFTONE Maps pixels from the source rectangle into blocks of pixels in the destination rectangle. The average color over the destination block of pixels approximates the color of the source pixels.
 After setting the HALFTONE stretching mode, an application must call the Win32 function SetBrushOrgEx to set the brush origin. If it fails to do so, brush misalignment occurs.
STRETCH_ANDSCANS Windows 95/98: Same as BLACKONWHITE
STRETCH_DELETESCANS Windows 95/98: Same as COLORONCOLOR
STRETCH_HALFTONE Windows 95/98: Same as HALFTONE.
STRETCH_ORSCANS Windows 95/98: Same as WHITEONBLACK
WHITEONBLACK Performs a Boolean OR operation using the color values for the eliminated and existing pixels. If the bitmap is a monochrome bitmap, this mode preserves white pixels at the expense of black pixels.

Return Value
The previous stretching mode. It can be STRETCH_ANDSCANS, STRETCH_DELETESCANS, or STRETCH_ORSCANS.

Remarks
The bitmap-stretching mode defines how information is removed from bitmaps that are compressed by using the function.

The BLACKONWHITE (STRETCH_ANDSCANS) and WHITEONBLACK (STRETCH_ORSCANS) modes are typically used to preserve foreground pixels in monochrome bitmaps. The COLORONCOLOR (STRETCH_DELETESCANS) mode is typically used to preserve color in color bitmaps.

The HALFTONE mode requires more processing of the source image than the other three modes; it is slower than the others, but produces higher quality images. Also note that SetBrushOrgEx must be called after setting the HALFTONE mode to avoid brush misalignment.

Additional stretching modes might also be available depending on the capabilities of the device driver.

По выбору
StretchBlt()
StretchDIBits()


 
mobila   (2006-05-08 16:50) [11]

Спасибо что разжевал, но вот в чём прикол когда я подставляю это в верхний пример и запускаю его то эффекта никакого, как была картинка чёткая, так и осталось.  
Недавно нашёл пример как раз то что мне надо при уменьшении картинки она получается как в фотошопе чуть-чуть размазанная не чёткая, но не могу понять как соединить верхний пример и пример из хелпа     D:\Program Files\Borland\Delphi7\Help\Examples\Jpeg\

Вот то что вырвал из примера в хелпе
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, ExtDlgs, StdCtrls;
type
 TForm1 = class(TForm)
   Button1: TButton;
   OpenPictureDialog1: TOpenPictureDialog;
   Image1: TImage;
   procedure Button1Click(Sender: TObject);
    procedure SetJPEGOptions(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure OpenFile(const Filename: string);
 end;
var
 Form1: TForm1;
implementation

{$R *.dfm}
USES Jpeg;
var
jpg: TJpegImage;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
 OpenFile(OpenPictureDialog1.FileName);
end;
procedure TForm1.OpenFile(const Filename: string);
begin
 try
   Image1.Picture.LoadFromFile(Filename);
 except
   on EInvalidGraphic do
     Image1.Picture.Graphic := nil;
 end;
 SetJPEGOptions(self);
end;
procedure TForm1.SetJPEGOptions(Sender: TObject);
begin
   with TJPEGImage(Image1.Picture.Graphic) do
   begin
     Scale := TJPEGScale(Self);
end;
end;
end.

А вот то что надо соединить

procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBItmap;
jpg: TJpegImage;
scale: Double;
begin
if opendialog1.execute then
begin
jpg := TJpegImage.Create;
try
jpg.Loadfromfile( opendialog1.filename );
if jpg.Height > jpg.Width then
scale := 50 / jpg.Height
else
scale := 50 / jpg.Width;
bmp:= Tbitmap.Create;
try
{Create thumbnail bitmap, keep pictures aspect ratio}
bmp.Width := Round( jpg.Width * scale );
bmp.Height:= Round( jpg.Height * scale );
bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
{Draw thumbnail as control}
Self.Canvas.Draw( 100, 10, bmp );
{Convert back to JPEG and save to file}
jpg.Assign( bmp );
jpg.SaveToFile(ChangeFileext( opendialog1.filename, "_thumb.JPG" ));
finally
bmp.free;
end;
finally
jpg.free;
end;
end;
end;

Помогите кто может!!!


 
programania ©   (2006-05-08 22:00) [12]

Пример процедуры для уменьшения картинки
http://programania.com/stretch.zip      53кб


 
mobila   (2006-05-09 19:01) [13]

Большое тебе спасибо!!! Хоть один человек выложил пример. Теперь буду совершенствовать свою программу.


 
SamBrook ©   (2006-05-11 00:46) [14]


> mobila   (06.05.06 11:58) [4]
> Эта книга для программирования на  C/C++
> http://irazin.ru/Downloads/Books/Yuan.rar


Спасибо за ссылку, давно искал эту книгу



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.044 c
3-1161004920
Petrovski
2006-10-16 17:22
2006.12.31
Что за ошибка "Invalid floating point operation"


15-1165946774
ProgRAMmer Dimonych
2006-12-12 21:06
2006.12.31
Наверное, ламерский вопрос...


15-1166058481
Бугага
2006-12-14 04:08
2006.12.31
«Черную дыру» поймали с поличным


15-1165569209
AntiUser
2006-12-08 12:13
2006.12.31
Какие есть типы лицензий компьютерного обеспечения?


6-1154989722
Rembo
2006-08-08 02:28
2006.12.31
интернет радио: сервер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский