PDA

View Full Version : تبدیل کردن بایت به عکس



arefba
سه شنبه 09 فروردین 1390, 14:49 عصر
بسم الله الرحمن الرحیم
با سلام خدمت دوستان
من می خواستم یه برنامه بنویسم که یه عکس رو بگیره بعدش تبدیلش کنه به بایت
بعدش آر جی بیش رو بگیرم و اون رو خط خط تو یه پیکچر باکس بزارم
تو تبدیل به بایت مشکلی نداشتم
فقط این آر جی بیش رو چطور بگیرم و بایت کنم
بعد ار اینکه بصورت stream فایل را خواندیم از داخل stream جریان بایت را خوانده و سه بایت سه بایت جدا میکنیم که رنگ ها را تشخیص دهیم و بوسیله pen شکل را رسم کنیم(اگه اشتباه نکنم!)

asif1358
سه شنبه 09 فروردین 1390, 21:56 عصر
سلام
خوب متوجه نشدم؛ اگه فقط می خواهی همان بایت ها را دوباره به تصویر تبدیل کنی، لازم نیست لقمه را بچرخانی!:اشتباه: شبیه ذیل عمل کن:

byte[] arrPic = ---------
MemoryStream ms = new MemoryStream(arrPic);
pictureBox1.Image = Image.FromStream(ms);

arefba
سه شنبه 09 فروردین 1390, 22:47 عصر
دوست عزیز من مشکلی با تبدیل بایت به عکس ندارم
می خوام از یه روش استفاده کنم که سه رنگ اصلی موجود در تصویر قرمز , سبز , آبی رو از تو عکس بایت شده در بیارم و بعد اون رو خط خط( توی یه تایمر ) در پیکچر باکس نمایش بدم

mehranmsba
سه شنبه 09 فروردین 1390, 23:16 عصر
دوست عزیز این مشکل شما رو حل می کنه:

Bitmap b = (Bitmap)pictureBox1.Image;

حالا هر طوری دوست دارید عکستون رو تبدیل به Bitmap کنید بعد:

b.GetPixel(x,y).A
b.GetPixel(x,y).R
b.GetPixel(x,y).B
b.GetPixel(x,y).G

مقدار رنگ پیکسل مورد نظر رو خارج کنید و بعد همون طور که پیکسل به پیکسل می خوانید عکستان را رنگ کنید.
لازم به ذکر است که ساختار RGB شامل 4 بایت است که کانال آخر Alpha است و در واقع می توان گفت وضوح رنگ است.

چرا باید عکستان بایت باشد؟ اگر عکس بایت باشد که تصویر سیاه و سفید خواهد شد (در حالت Mono) من پیشنهاد می کنم شما استخراج بایت ها رو به C# بسپارید.
یعنی:

Bitmap Aks = Bitmap.FromFile("Adresse File");


حالا استخراج رو با GetPixel انجام بدید.

برای رنگ کردن هم از SetPixel استفاده کنید.

موفق باشید.

mehranmsba
سه شنبه 09 فروردین 1390, 23:21 عصر
نکته ای از قلم افتاد، اگر هم کلا دسترسی شما بایتی است مثلا از یک پورت سریال می خوانید می توانید از:

Color picColor = Color.FromArgb("int red", "inr Green", "int blue");

حال رنگ ایجاد شده حاصل رنگ بایت های شماست.
اگر مقدار رتگ های شما در متد فوق معکوس شد این گونه عمل کنید:

Color picColor = Color.FromArgb("255-int red", "255-int Green", "255-int blue");


موفق باشید.

arefba
سه شنبه 09 فروردین 1390, 23:39 عصر
نه از پورت نمی خونم من همینطوری می خوام تست کنم که یه بایت رو بدون بعضی از توابع متداول و با روشی که گفتم به عکس تبدیل کنم
روش اولی که گفتین
میشه یه مثال بزارید
عالی میشه
ممنون

mehranmsba
چهارشنبه 10 فروردین 1390, 00:09 صبح
Bitmap b =(Bitmap)Bitmap.FromFile("C:\\TestFiles\\1.bmp");

string a=string.Empty;
byte[,] pixR = new byte[b.Width,b.Height];
byte[,] pixG = new byte[b.Width,b.Height];
byte[,] pixB = new byte[b.Width,b.Height];
for (int i = 0; i < b.Height; i++)
{
for (int j = 0; j < b.Width; j++)
{
pixR[j, i] = b.GetPixel(j, i).R;
pixB[j, i] = b.GetPixel(j, i).B;
pixG[j, i] = b.GetPixel(j, i).G;
}
}
Bitmap q=new Bitmap(b.Width,b.Height);
for (int i = 0; i < b.Height; i++)
{
for (int j = 0; j < b.Width; j++)
{
q.SetPixel(j,i,Color.FromArgb(pixR[j,i],0,0));


}


}

pictureBox1.Image = q;

شما حالا می توانید با سه For شروع به پر کردن کانال مربوط به رنگ کنید (برای تزریق رنگ های جدا جدا)
همچنین می توانید هر سه را تک تک تزریق کنید.

نکته: عناصر فرمی معمولا عناصر کندی هستند و نمی توانید آن ها را در بازه های کوتاه جاروب کنید.

اگر پیکترباکس در For ها قرار بگیرد طبق نکته بالا نمی توانید آن را مانند یک انیمیشن Interactive کنید.

موفق باشید.

arefba
چهارشنبه 10 فروردین 1390, 00:36 صبح
میشه یه کتابی معرفی کنید که این مباحث رو به صورت حرفه ای توضیح بده؟
و اینکه شما زبانتون قویه برای اینکه درک بهتری از مطالب انگلیسی تخصصی نرم افزار داشته باشیم راه خوبی رو سراغ دارین ؟

زینب حسینی
یک شنبه 15 مرداد 1391, 17:26 عصر
سلام من می خوام عکسی که توسط برد arm7 گرفتم و روی حافظه برد ذخیره شده رو توسط پورت سریال با برنامه زیر بخونم
پورت سریال بردم به usb کامپیوتر وصل میشه ----> پورت سریال حساب میشه دیگه؟
برنامم ویژوال ++c
این برنامه ای که شما برای تبدیل بایت به عکس گفتین ++c یا #c؟
اگه #c هس میشه واسه ++c بگین؟
// aaaaaaaaaa.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <commdlg.h>
#define READ_TIMEOUT 500
#include <windef.h>



int _tmain(int argc, _TCHAR* argv[])
{
TCHAR* currentuser = L"COM8";

LPCWSTR *lstr = (LPCWSTR *)(&currentuser);

HANDLE hComm;

DWORD dwRead;

OVERLAPPED osReader = {0};

DWORD dwRes;

hComm = CreateFile(*lstr,GENERIC_READ | GENERIC_WRITE, 0, 0,
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);

if (hComm == INVALID_HANDLE_VALUE) printf("*Error opening port\n");

else printf("*Port opened succesfully\n");

osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (osReader.hEvent == NULL) printf("*Error creating overlapped event; abort\n");

BYTE inByte = 1;

for(int i=0; i<100; i++) {

if(!ReadFile(hComm, &inByte, 1, &dwRead, &osReader))

dwRes = WaitForSingleObject(osReader.hEvent, READ_TIMEOUT);

printf("%02x\n", inByte);

}
CloseHandle(osReader.hEvent);

//wait for user

int a;

scanf("%d", &a);

return 0;
}

وقتی این برنامه رو اجرا می کنم پیام زیر رو میده در صورتی که هر دو فایل در system32 هسش؟
'aaaaaaaaaa.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Cannot find or open the PDB file
'aaaaaaaaaa.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Cannot find or open the PDB file
ممنون میشم جواب سوالامو بدین

mehranmsba
دوشنبه 06 شهریور 1391, 20:55 عصر
برنامه شما با VC است اما با توجه به اینکه بیان نموده اید با C# نیز می توانید، برای شما برنامه ای با C# نوشتم ( البته خیلی ساده و سریع نوشته شد، برای همین اصلا الگوریتمش بهینه نیست)
تعدادی بایت را می گیرد و به عکس تبدیل می کند، و عکس می گیرد و به بایت تبدیل می کند.
توضیحات:
کلید To Image Black بایت های نوشته شده را به یک عکس سیاه و سفید تبدیل می کند.
کلید To Image Color بایت های نوشته شده به ترتیب زیر به یک عکس رنگی تبدیل می کند.
Red
Green
Blue
برای اطلاعات بیشتر و نحوه درج بایت ها در برنامه می توانید از فایل های Pattern در فایل ضمیمه استفاده کنید.

موفق باشید.

IMAN61Zz
جمعه 01 بهمن 1395, 23:53 عصر
فایل ضمیمه ش کو