PDA

View Full Version : سوال در مورد کار با عکس ها در دلفي؟؟؟؟



K.Mohammadreza
یک شنبه 28 تیر 1388, 18:06 عصر
با سلام
من از تابع زير جهت کد گذاري يک فايل بيت مپ استفاده کردم اين کد در تمام سايت ها ايراني و خارجي وجود دارد




procedure Tform1.EncryptBMP(const BMP: TBitmap; Key: Integer);
var
BytesPorScan: Integer;
w, h: integer;
p: pByteArray;
begin
try
BytesPorScan := Abs(Integer(BMP.ScanLine[1]) -
Integer(BMP.ScanLine[0]));
except
raise Exception.Create('Error');
end;
RandSeed := Key;
for h := 0 to BMP.Height - 1 do
begin
P := BMP.ScanLine[h];
for w := 0 to BytesPorScan - 1 do
P^[w] := P^[w] xor Random(256);
end;
end;


اما من ميخواهم اين عمل روي عکس هاي Jpeg انجام شود نه فايل هاي Bmp. در صورتي که بجاي فايل bmp از فايل jpg استفاده کنم خطا مي دهد و قسمت Exception اتفاق مي افتد. در ضمن توابع تبديل فرمت عکسهابه يکديگر را هم دارم ولي بديليل اينکه نميخواهم سرعت برنامه کم شود نمي خواهم از اين توابع استفاده کنم. آبا کسي تابعي براي کد گذاري فايلهاي عکس با فرمت Jpeg دارد؟
در ضمن با توجه به کار برنامه نياز دارم تا پسوند فايل عکس را به پسوند ناشناخته اي عوض کنم البته بعد از کد گذاري ولي با اينکار ديگر قادر به لود کردن عکس نيستم. يعني اول با دستور زيز آن را تغيير پسوند دادم و ذخيره کردم ولي وقتي دوباره تغيير پسوند مي دهم و ميخواهم ان را در کنترل Image از فايل لود کنم پيغام عدم وجود فايل مي دهد. با فرض اينکه مسير ذخيره عکس تغير پسوند داده شده در متغير strFilename باشد





strFilename := ChangeFileExt(strFilename , '..jpg');
Imaage1.picture.loadfromfile(strFilename);

که پيغام خطا مي دهد. آيا کسي راه حلي براي اين مشکل دارد؟

Hsimple11
یک شنبه 28 تیر 1388, 18:17 عصر
فرمت استاندارد عکس BitMap است که میتونید روش انواع توابع رو استفاده کنید. JPEG و خیلی از فرمتهای دیگه اساسا قابل دستکاری مثل BMP نیستند. باید با BMP کار کنید.

در مورد سوال دومتون هم متوجه نشدم. شما اسم فایلهاتون رو Encode میکنید بعد روش بازیابیش رو ندارید؟

Felony
یک شنبه 28 تیر 1388, 18:28 عصر
در ضمن با توجه به کار برنامه نياز دارم تا پسوند فايل عکس را به پسوند ناشناخته اي عوض کنم البته بعد از کد گذاري ولي با اينکار ديگر قادر به لود کردن عکس نيستم. يعني اول با دستور زيز آن را تغيير پسوند دادم و ذخيره کردم ولي وقتي دوباره تغيير پسوند مي دهم و ميخواهم ان را در کنترل Image از فايل لود کنم پيغام عدم وجود فايل مي دهد. با فرض اينکه مسير ذخيره عکس تغير پسوند داده شده در متغير strFilename باشد
کدی که نوشتین رو کامل بزارین تا ببینیم مشکل از کجاست .

K.Mohammadreza
یک شنبه 28 تیر 1388, 20:10 عصر
با سلام به دوستان و با تشکر از پاسخ هايتان
در مورد دوست خوبمون که گفته بودند کد نوشته شده را بزارين تا ببينيم.
کافيه يک کنترل Image, يک کنترل Button روي فرم گذاشته و يک فايل عکس را در کامپيوتر خود پيدا کرده و پسوند آن ا به يک پسوند ناشناخته عکس تغيير دهيد. مثلا Sample.jpg را به Sample.cvm تغيير دهيد سپس در برنامه در رويدا کليک دکمه کدهاي زير را بنويسيد تا متوجه مشکل شويد.



procedure TfrmMain.btnLoadImageClick(Sender: TObject);
var
strFilename:string;
begin
with TOpenDialog.Create(frmMain) do
begin
try
Title := 'باز کردن عکس';
Filter := 'All Picture Crypt Files|*.cvm';
if Execute then
begin
strFilename := ChangeFileExt(FileName, '.jpg');
Image.Picture.LoadFromFile(strFileName);
end;
finally
Free;
end;
end;
end;



مشکل هم اينجاست که پيغام ميده فايل انتخاب شده وجود ندارد!!!!!:اشتباه:

K.Mohammadreza
یک شنبه 28 تیر 1388, 20:12 عصر
در مورد اون دوستمون هم که نوشته بودند بايد با فايلهاي بيت مپ کار کنم بايد عرض کنم که من يکسري اسناد حساس را توسط برنامه ام اسکن مي کنم و اين فايلها حتما بايد رمز گذاري شوند و حتما هم بايد نوعشان jpg باشد. و نياز دارم تابعي فايها را رمز گذاري کند منظورم محتواي فايل ااست مثل همان تابعي که قبلا نوشته بودم

با تشکر

vcldeveloper
یک شنبه 28 تیر 1388, 23:08 عصر
من يکسري اسناد حساس را توسط برنامه ام اسکن مي کنم و اين فايلها حتما بايد رمز گذاري شوند
برای رمزنگاری نیازی ندارید که حتما نوع محتوای فایل (Bitmap یا JPEG) را بدانید. با فایل به عنوان یک مجموعه بایت رفتار کنید. فایل را در یک Stream بریزید، و با یک الگوریتم رمزنگاری آن را کد کنید.

K.Mohammadreza
دوشنبه 29 تیر 1388, 00:47 صبح
اقاي کشاورز فايلي که با روش کد گذاري بايتي کد شود و سپس کد کشايي شود فکر نکنم زياد جالب باشد من دوست دارم محتويات عکس عوض شود نه اينکه ديگر قابل نمايش نباشد اگر از برنامه filpAlbum استفاده کرده باشد آن هم از روشي که من ميخواهم استفاده کنم استفاده مي کند و با دلفي 6 نوشته شده است.

Felony
دوشنبه 29 تیر 1388, 01:35 صبح
procedure TfrmMain.btnLoadImageClick(Sender: TObject);
var
strFilename:string;
begin
with TOpenDialog.Create(frmMain) do
begin
try
Title := 'باز کردن عکس';
Filter := 'All Picture Crypt Files|*.cvm';
if Execute then
begin
strFilename := ChangeFileExt(FileName, '.jpg');
Image.Picture.LoadFromFile(strFileName);
end;
finally
Free;
end;
end;
end;
اون خطی از کد رو که قرمز کردم ببینید ، مشکل اونجاست ، تابع ChangeFileExt به طور فیزیکی فرمت رو تغییر نمیده .

K.Mohammadreza
دوشنبه 29 تیر 1388, 13:39 عصر
دوست گرامي من هم ميدونم که مشکل کجاست!!! ولي راه حلش چيه؟
چطور من ميتونم با همون روش بالا پسوند فايل ديتابيس را عوض کنم و استفاده کنم. مثل همون کاري که در بسياري از برنامه هاي پايگاه داده وجود داره مثل برنامه ديکشنري القاموس و غيره و حتي خودم هم استفاده کردم و جواب داده ولي در مورد فايلهاي عکس اينکار امکان پذير نيست؟؟؟!!!!! من بايد پسوند فايل را عوض کنم و و سپس مورد استفاده قرار بدم و در ضمن هيچ کس راه حلي براي کد گذاري محتويات فايلهاي عکس با فرمت jpg نداره؟؟؟؟

Felony
دوشنبه 29 تیر 1388, 15:32 عصر
من وقت نداشتم روش کار کنم با کمی حوصله میشه بهینه تر و تمیز تر نوشتش :


var
StrFilePath,StrFileName:string;
begin
with TOpenDialog.Create(Form1) do begin
try
Title := 'باز کردن عکس';
Filter := 'All Picture Crypt Files|*.cvm';
if Execute then begin
StrFilePath:=ExtractFilePath(FileName);
StrFileName:=ExtractFileName(FileName);
RenameFile(FileName,Copy(StrFileName,0,Length(StrF ileName)-4)+'.jpg');
Image.Picture.LoadFromFile(Copy(FileName,0,Length( FileName)-4)+'.jpg');
RenameFile(Copy(StrFileName,0,Length(StrFileName)-4)+'.jpg',FileName);
end;
finally Free;
end;
end;
end;