PDA

View Full Version : سوال: bitmap



ATmegamin
چهارشنبه 08 آبان 1387, 21:22 عصر
بازهم سلام
من به صورت زیر یه پروژه MFCساختم :(VSTDIO2008.NET)
Aplication type: SingleDocument
Compound document support: none
Nonlocalized strings:File extension:bmp
Database support: none
Generated classes: Base class: CView
حالا وقتی که فایل رو openمیکنم ، اسم Form ،اسم فایل bmp رو نشون میده ولی خودفایل رو نشون نمیده!
اگر ممکن هست من رو step by step راهنمایی کنید چون تازه کارم و نمیدونم توابعی که شما گفتید رو کجا باید استفاده کنم :چشمک:
درضمن من این برنامه رو نوشتم : (MFC)



viod CsetpixelView::OnDrow (CDC* pDC)
{
using namespace std;
CstpixelDoc*pDC=GetDocument ();
ASSERT_VALID (pDoc);
int pixcolor;
ofstream fout ("c:\\data.txt");
for (int i=0;i<32;i++)
{
for (j=0;j<32;j++)
{
pDC->Arc (0,0,32,32,0,0,32,32);
pixcolor = pDC->GetPixel (j,i);
fout << !(pixcolor) << ",";
}
fout << "\n";
}
}

اگر کپی بشه تو VSTDIO درست خونده میشه ، فایل های هدر هم به شکل زیر تغییر کردند :



#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include "set pixel.h"
#include "set pixelDoc.h"
#include "set pixelView.h"

_________________________________-
حالا بعد از اجرای برنامه ، برنامه رو ببندید ، و فایل c:\data.txt رو باز کنید ، فونت سایز رو 1 انتخاب کنید .
----------------------------------------------
این هدف کلی هستش ، من میخوام یه فایل bmp رو کاربر open کنه وautomatic برنامه این تبدیل رو انجام بده

ATmegamin
شنبه 11 آبان 1387, 09:02 صبح
آقا نیما سلام
اگر امکان داره کدزیرروبررسی کنید (OnDrow)
void CsetpixelView::OnDraw(CDC* pDC)
{
using namespace std;
CsetpixelDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int pixcolor;
ofstream fout ("c:\\data.txt");
for (int i=0;i<32;i++)
{
for (int j=0;j<32;j++)
{
pDC->Arc (0,0,32,32,0,0,32,32);
pixcolor=pDC->GetPixel (j,i);
fout << !(pixcolor) << ",";
}
fout << "\n";
}
من میخوام بجای Arc عکسی که توسط کاربر open میشه به 0,1 تبدیل بشه
لطفا کمکم کنید.

Nima_NF
شنبه 11 آبان 1387, 15:21 عصر
لطفا از تگ code که با علامت # مشخص شده است استفاده کنید تا کدها قابل خواندن باشد.

در تاپیک قبلی که ارسال کردید چند نمونه لینک معرفی کردم که جهت نمایش عکس بود، احتمالا بررسی نکردید!
برای نمایش یک عکس می توانید به شکل زیر عمل کنید:



void CMFC_t1View::OnDraw(CDC* pDC)
{

CMFC_t1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

HBITMAP hBmp = (HBITMAP)::LoadImage(NULL,L"C:\\pic.bmp",
IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
CBitmap bmp;
bmp.Attach(hBmp);

// Get the size of the bitmap
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);

CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);

// Select the bitmap into the in-memory DC
CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);

pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
0, 0, SRCCOPY);

//------------
// Here write your getpixel codes
COLORREF color = dcMemory.GetPixel(450,500);

// if (color == 0) ... else ....
//------------

dcMemory.SelectObject(pOldBitmap);

}

- اگر خواستید که عکس در پنجره نمایش داده نشود و فقط اطلاعات bmp را دریافت کنید، فراخوانی تابع BitBlt را حذف کنید.
- در خط بعد از آن قبل از SelectObject بعدی می توانید با GetPixel که در فوق مثال زده ام به راحتی با مختصات پیکسل مورد نظر در حافظه dcMemory ،اطلاعات را دریافت کنید.
مثلا در خط بعدی آن همان فایل data.txt را باز کنید و با یک شرط که اگر color دریافتی مقدار 0 بود آنگاه همان صفر، اگر هم غیر صفر بود عدد 1 در فایل ذخیره شود.(برای عکس های سیاه و سفید)
برای عکس های رنگی هم خودتان باید قانونی به همین شکل بنویسید.

- ضمنا برای افزایش کارآیی اگر نمی خواهید عکس نمایش داده شود می توانید کدها را در OnInitDialog یا سایر قسمت ها که معمولا یک مرتبه فراخوانی می شوند مانند زمانی که کلید زده می شود فراخوانی کنید.

complexcoding
دوشنبه 13 شهریور 1391, 11:19 صبح
خوب حالا این کدها را در کدام قسمت MFC بنویسیم؟